4

私の問題は一般的なエラーであり、この問題に対して多くの回答を試みましたが、まだうまくいきません。したがって、最初から始めるために、Html.BeginForm ヘルパーを使用する MVC プロジェクトに部分的なフォームがあります。

<%using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new{@class = "form-class"}))

「MyAction」と「MyController」は実際の名前ではありませんが、下線の付いた名前が確認されると解決されます。私のコントローラーでの私のアクションは次のとおりです。

[HttpPost]
    public ActionResult MyAction(int id, FormCollection form)
    {
     EditedData dt = new EditedData();
      // does some db submits and returns edited data

        return View(dt);
    }

したがって、よくある問題は、[HttpPost] を使用すると「リソースが見つかりません」というエラーが返されることです。[HttpPost] をコメントアウトしてデバッグしたところ、MyAction にヒットしたため、ルーティングされません (?)。私の global.asax変更されていません:

public class MvcApplication : System.Web.HttpApplication
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    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
        );

    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

私が言うように、私は他の投稿で他の回答を試しましたが、それはポスターでうまくいくようですが、まだ問題があります. 私は何が欠けていますか?

PS View Sourceでは、フォームタグが次のように表示されます。

<form method="post" action="690" id="form1">

アクションが MyAction を指す必要がある場合。「MyAction」を指すように Html.BeginForm を設定するにはどうすればよいですか?

4

1 に答える 1

4

問題は、アクションのidパラメーターが int (値型) であるため、null 参照として渡すことができないことです。そのため、呼び出し (ビュー) で明示的に 0 に設定するBeginFormか、null 可能にする必要があります。

基本的に、ルーティング エンジンは、与えられたデータ (アクション名とコントローラー名) + ルート マッピングに基づいて、アクションとコントローラーを解決できません。

サンプル (パラメータをそのままにしておくことにした場合int):

<%using (Html.BeginForm("MyAction", "MyController", new { id = 0 }, FormMethod.Post, new { @class = "form-class" }))

このオーバーロードは、コントローラーで指定した署名と一致します。編集中は、0をモデル プロパティに一致するものに置き換えるだけです。例えば:

<% using (Html.BeginForm("MyAction", "MyController", new { id=Model.ID }, FormMethod.Post, new{ @class = "form-class"})) %>
于 2013-05-27T16:29:34.460 に答える