我正在尝试制作一个简单的测试网站,以允许我使用 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方法之间的区别,但是我已经添加了属性。这可能是什么原因造成的?我怎样才能让它再次工作?
MVC 不授权您拥有 2 个同名的操作方法。
但是当 http 动词不同时(GET、POST),您可以使用相同 URI 的 2 个操作方法。使用 ActionName 属性设置操作名称。不要使用相同的方法名称。您可以使用任何名称。约定是添加 http 动词作为方法后缀。
[HttpPost]
[ActionName("Create")]
public ActionResult CreatePost(Customer cust)
{
if (ModelState.IsValid)
{
_repository.Add(cust);
return RedirectToAction("GetAllCustomers");
}
return View(cust);
}
在我的例子中,GET 和 POST 方法具有相同的路径,但 GET 方法有一个带有可选参数的路由,而 POST 方法没有。将此属性添加到 POST 方法解决了问题:
[Route("")]