我可能在这里遗漏了一些东西,但是在ASP.NET MVC 4中,我无法使用以下内容。
给出以下控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(string order1, string order2)
{
return null;
}
}
并且它的观点是:
@{
ViewBag.Title = "Home";
}
@using (Html.BeginForm())
{
@Html.TextBox("order1")<br />
@Html.TextBox("order2")
<input type="submit" value="Save"/>
}
启动应用时,我得到的就是:
控制器类型的当前动作请求'索引' 'HomeController'在以下操作方法之间不明确: System.Web.Mvc.ActionResult索引()类型 ViewData.Controllers.HomeController System.Web.Mvc.ActionResult 索引(System.String,System.String)类型 ViewData.Controllers.HomeController
现在,在ASP.NET MVC 3中,上面的工作正常,我只是尝试过,所以在ASP.NET MVC 4中有什么改变来打破这个?
好吧,我有可能在这里做些傻事,而不是注意到它。
编辑:
我注意到在MVC 4应用程序中,Global.asax.cs文件不包含此内容:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
默认情况下,MVC 3应用程序执行的操作。所以我将上面的内容添加到MVC 4应用程序中,但它失败并出现相同的错误。请注意,MVC 3应用程序可以正常使用上述路由。我通过Request.Form传递“订单”数据。
编辑:
在文件RouteConfig.cs
中,我可以看到RegisterRoutes
被执行,具有以下默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
我仍然得到原始错误,认为在Index()
方法之间存在歧义。
答案 0 :(得分:10)
因为MVC4附带ASP.Net Web.API,你可以引用两个HttpPostAttribute
(同样适用于HttpGet
等其他属性):
System.Web.Mvc.HttpPostAttribute
由ASP.Net MVC 使用,因此您需要在Controller
派生控制器内的操作中使用它
System.Web.Http.HttpPostAttribute
由ASP.Net Web.API 使用,因此您需要在内部操作中使用它
ApiController
派生控制器
您在代码中偶然引用了System.Web.Http.HttpPostAttribute
。将其更改为使用正确的属性,它应该正常工作:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[System.Web.Mvc.HttpPost]
public ActionResult Index(string order1, string order2)
{
return null;
}
}