在ASP.NET MVC应该是一个表单发布到自己还是另一个行动?

时间:2010-05-28 09:12:51

标签: asp.net-mvc

这两个场景中的哪一个是ASP.NET MVC中的最佳实践?

1张贴自我

在视图中使用

using (Html.BeginForm) {
    ...
}

在控制器中你有

    [HttpGet]
    public ActionResult Edit(int id)

    [HttpPost]
    public ActionResult Edit(EditModel model)

2从编辑发布到保存

在视图中使用

using (Html.BeginForm("Save", "ControllerName")) {

在控制器中你有

    [HttpGet]
    public ActionResult Edit(int id)

    [HttpPost]
    public ActionResult Save(EditModel model)

摘要

我可以看到每一个的好处,前者给你一个更宁静的风格,同一个地址与正确的HTTP动词(GET,POST,PUT,DELETE等)一起使用。后者有一个URL模式,使每个地址都非常具体。

这是正确的方法吗?

3 个答案:

答案 0 :(得分:4)

对于RESTful控制器:

// return an HTML form for editing a specific entity
public ActionResult Edit(int id) { }

// find and update a specific entity
[HttpPut]
public ActionResult Update(EditModel userView) { }

在视图中:

<% using (Html.BeginForm<HomeController>(c => c.Update(null))) {%>
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %>
    <%: Html.EditorForModel() %>
    <input type="submit" value="Save" />
<% } %>

答案 1 :(得分:3)

发布相同的动作。

否则,如果在“保存”中验证失败,则需要重定向到“编辑”。您必须在Tempdata中存储错误消息并从中重新填充ModelState。

答案 2 :(得分:0)

我更喜欢使用编辑/更新,因为我认为它可以更清楚地了解操作的内容。 Stephen Walther some good suggestions for standard action names使用该惯例。

我不认为它真的很重要但我会说在所有控制器中保持一致更为重要。

作为旁注,如果REST是您的要求,那么我相信以下内容更适用于RESTfull应用程序:

[HttpGet]
public ActionResult Customer(int id) {
  //return customer details
}

[HttpPut]
public ActionResult Customer(Customer cust) {
  //update customer
}

[HttpPost]
public ActionResult Customer(Customer cust) {
  //insert new customer
}

如果不需要REST,那么我将使用编辑/更新约定