Microsoft是否更改了ASP.NET MVC处理重复操作方法名称的方式?

时间:2012-12-14 18:09:00

标签: asp.net-mvc-4

我可能在这里遗漏了一些东西,但是在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()方法之间存在歧义。

1 个答案:

答案 0 :(得分:10)

因为MVC4附带ASP.Net Web.API,你可以引用两个HttpPostAttribute(同样适用于HttpGet等其他属性):

您在代码中偶然引用了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;
    }
}