【问题标题】:What is the best practices to handle multiple form operation under same action in ASP.NET MVC4?在 ASP.NET MVC4 中的同一操作下处理多个表单操作的最佳实践是什么?
【发布时间】:2012-11-26 13:28:24
【问题描述】:

我在使用 Razor 引擎的 ASP.NET MVC4 项目中有以下场景:

  • 我的视图至少有 4 种不同的形式。
  • 我想在相同的动作映射下处理所有表单POST。

其实这4个表单post到不同的Route Mapping,如下:

POST: /User/FilterRolesInUse/15
POST: /User/RemoveRoles/15
POST: /User/FilterRolesNotInUse/15
POST: /User/AddRoles/15

我想知道是否可以在 same Route Mapping 下处理所有 4 个表单,所有表单都发布到 /User/Roles/15,然后控制器可以区分提交了哪个表单。这个概念类似于:

class UserController : Controller {

  //
  // POST: /User/Roles/
  public ActionResult Roles(int? id, object form) {
    return DelegateToFormLogic(id, form);
  }

}

我只是想知道这是否可能,因为我真的想保持 URL 一致

欢迎任何建议建议

【问题讨论】:

    标签: asp.net-mvc-4 url-routing razor-2


    【解决方案1】:

    我看不出拥有一个执行多种功能的动作有什么好处。事实上,任何必须支持该代码的人都会感到困惑。我将摆脱提交表单并在您的 Web 客户端中使用 Ajax 方法(使用 JQuery ajax)来获取此视图和更新/插入/删除操作所需的数据。这样,您不必回发整个页面来执行可能仅在视图的某些部分上发生的操作,这将导致更好的页面性能和更好的用户体验。将您的控制器更改为 ASP.NET Web API 控制器,并使这些方法成为使用一致 URL 命名约定并使用 HTTP 动词来指示正在执行的操作类型的 REST API。您最终将获得 3 种方法,这些方法为您现在拥有的 4 种方法提供服务,它可能看起来像这样(它们对应于问题中列出的相同顺序)。

    GET: /api/Role/15?InUse=True
    DELETE: /api/Role/15
    GET: /api/Role/15?InUse=False
    POST: /api/Role
    

    你的控制器应该是这样的。

    class RoleController : ApiController {
    
      public List<Role> Get(int id, boolean InUse) { ... }
      public void Delete(int id) { ... }
      public void Post(List<Role> roles) { ... }
    }
    

    这保持了关注点的清晰分离,同时还保持了一致且易于理解的 URL 约定。

    【讨论】:

    • 确实!关注点分离是必须的,您对使用 Web API 的建议绝对是处理这种情况的方法。谢谢@kevin-junghans!
    猜你喜欢
    • 2019-01-04
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2017-08-15
    • 2012-09-01
    相关资源
    最近更新 更多