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' に対する現在の要求は、次のアクション メソッド間であいまいです: タイプ ViewData.Controllers.HomeController の System.Web.Mvc.ActionResult Index() System.Web.Mvc.ActionResult Index(System. String、System.String) 型の ViewData.Controllers.HomeController

さて、ASP.NET MVC 3 では上記が正常に動作するので、試してみましたが、ASP.NET MVC 4 で何が変更されてこれが壊れたのでしょうか?

OK、ここで何かばかげたことをしていて、それに気付いていない可能性があります。

編集:

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 が付属しているため、次の 2 つを参照できる可能性があります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;
    }
}
于 2012-12-15T17:02:38.117 に答える