MVC中的动作名称与对应的http谓词相同

本文关键字:http 谓词 MVC | 更新日期: 2023-09-27 17:53:22

可以在MVC的动作方法有相同的名称作为http动词?我知道这在Web API中是可能的,但不确定在MVC中。

例如,来自联系人编辑表单的帖子会自动调用下面代码中的第二个方法,get请求会自动调用第一个方法。

[ActionName("GET")]
public ActionResult EditContact( int contactId )
{
  var contact = DB.RetrieveContact( contactId );
  return View(contact);
}
[ActionName("POST")]
public ActionResult EditContact( Contact contact )
{
  DB.SaveContact( contact );
  return View(contact);
}

更新1 :

在MVC中,不能依赖于ActionName被设置为http动词来正确调用post或get请求的方法,不像在Web API中。需要在视图中的代码和要调用的操作之间创建显式关联,如本文末尾的razor代码所示。

在示例MVC项目中尝试后,我发现上面的代码不会自动将post请求重定向到名为' post '的方法。我必须在BeginForm的razor代码中显式地提到动作名称为POST,或者在处理POST请求的方法中添加'HttpPost'属性。

所以下面的razor代码需要与上面的代码一起工作。

@Html.ActionLink("Edit Contact Example","GET","Contact", new {contactId = 235}, null)
@using (Html.BeginForm("POST", "Contact"))
{
  <input type="text" id="t1" name="Contact.ContactId" />
  <input type="text" id="t2" name="Contact.ContactName" />
  <input type="text" id="t3" name="Contact.ContactAge" />
  <input type="submit" value="Submit" />
}

MVC中的动作名称与对应的http谓词相同

是的,你只需要用[HttpPost]标记你的post动作。第一个是get方法,不管你是否省略了[ActionName(" get ")]