2

我可能在这里遗漏了一些东西,但在 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”的操作“Index”的请求在以下操作方法之间不明确: System.Web.Mvc.ActionResult Index() on type ViewData.Controllers.HomeController System.Web.Mvc.ActionResult Index(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()调用哪个方法之间的歧义。

4

1 回答 1

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;
    }
}
于 2012-12-15T17:02:38.117 回答