MVC4忽略[HttpGet]和[HttpPost]属性

时间:2012-10-18 09:53:57

标签: c# asp.net-mvc asp.net-mvc-4 http-post http-get

我正在尝试建立一个简单的测试网站,允许我使用MVC4列出,创建,编辑和删除客户对象。

在我的控制器中,我有2个创建方法,当窗体加载控件时获取Get,以及实际保存数据的Post。

    //
    // GET: /Customer/Create

    [HttpGet]
    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Customer/Create

    [HttpPost]
    public ActionResult Create(Customer cust)
    {
        if (ModelState.IsValid)
        {
            _repository.Add(cust);
            return RedirectToAction("GetAllCustomers");
        }

        return View(cust);
    }

但是当我运行项目并尝试访问创建操作时,我收到一个错误:

The current request for action 'Create' on controller type 'CustomerController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Create() on type [Project].Controllers.CustomerController
System.Web.Mvc.ActionResult Create([Project].Models.Customer) on type [Project].Controllers.CustomerController

我理解它无法看到我的Get和Post方法之间的区别,但我添加了属性。可能是什么原因以及如何让它再次发挥作用?

1 个答案:

答案 0 :(得分:2)

MVC不会授权您使用两个具有相同名称的操作方法。

但是当http动词不同(GET,POST)时,你可以有2个具有相同URI的动作方法。使用ActionName属性设置操作名称。不要使用相同的方法名称。您可以使用任何名称。惯例是将http动词添加为方法后缀。

[HttpPost]
[ActionName("Create")]
public ActionResult CreatePost(Customer cust)
{
    if (ModelState.IsValid)
    {
        _repository.Add(cust);
        return RedirectToAction("GetAllCustomers");
    }

    return View(cust);
}