11

ASP.net MVCを使用すると、フォームではなくURLからのパラメーターを含むコントローラーアクションにフォームをPOSTすることができますか?

例えば

GroupControllerのActionメソッド:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(int idOne, int idTwo, Model model)
    { ... }

ルート:

"{controller}/{action}/{idOne}/{idTwo}"

投稿されたURL:

/Employee/Show/1/42

この例では、フォームは別のコントローラーに送信されており、モデルの値は正しいですが、他のパラメーターのデフォルト値は0です。

私が期待していた動作は、ModelBinderが、指定されたルートに一致する2つのパラメーターがあることを認識し、GET操作が機能するのと同じ方法でパラメーターに1と42の現在の値を割り当てることです。

この動作はサポートされていませんか、それとも何かが足りませんか?

編集:明確にするShowために、コントローラーのビューEmployeeのフォームには、別のコントローラーに投稿しているフォームが含まれています。私たちはそれを呼ぶことができますGroup

フォームアクションのURLは次のようになります

/Groups/Create/0/0

フォームは次のように宣言されます

Html.BeginForm("Create", "Groups")

のために多くの異なるオーバーロードを試した後Html.BeginForm、フォームアクションURLがブラウザのアドレスバーの現在のURLと一致する場合にのみパラメータがマップされることがわかりました。

したがって、URL/Groups/Create/1/42に移動すると、新しいフォームが表示されます。次にフォームを送信すると、URLルート値がPOSTアクションに渡されます。

4

5 に答える 5

10

あなたの質問を正しく理解できれば、ルート値を含む URL を指すactionレンダリングされた要素の が必要です。これは、拡張メソッド<form>のオーバーロードの 1 つを使用して可能にする必要があります。HtmlHelper.BeginForm()

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post);

あなたの質問が間違っていたら教えてください:)

于 2010-03-17T20:14:07.787 に答える
2

フォーム内の入力からのみフォームデータを投稿できると確信しています。URL からフォーム入力値を作成するような方法でビューをレンダリングすることを検討しましたか (おそらく HTML ヘルパーを使用しますか?)。

更新:フォームをまったく使用したくない場合はControllerContext.RouteData.Values["idOne"]、メソッド シグネチャを介して渡すのではなく、使用してください。

于 2010-03-18T14:14:12.210 に答える
1

私は同様の問題を抱えていました.RouteConfigの設定はこの問題を解決しました.

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
             ...
             routes.MapRoute(
             "MyRoute",
             "{controller}/{action}/{idOne}/{idTwo}",
             new
             {
                 controller = "Employee", // as an example
                 action = "Show",
                 idOne = UrlParameter.Optional,
                 idTwo= UrlParameter.Optional
             }, new { idOne = @"\d{1,5}" });

        }
    }

...そして... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post))

応答に開始タグを書き込みます。ユーザーがフォームを送信すると、リクエストはルート ターゲットによって処理されます。このメンバーはオーバーロードされています。構文、使用法、例など、このメンバーの詳細については、オーバーロード リストの名前をクリックしてください。

そして全作品

于 2013-11-19T17:57:58.367 に答える
0

Create ビューに到達したら、そこに到達するために使用されたルート値をポスト アクションに再ポストする必要があります。

したがって、1 つのオプションは、ルートから取得した ID を保持するために、1 組の非表示にすることです。このように、フォームを投稿すると、その値が他の入力と共に投稿されます。

于 2013-11-19T16:32:43.243 に答える
0

私も最近この問題を抱えていました。別のルートがあったため、渡していた追加のルート パラメータを考慮せずに、デフォルト ルートにマッピングしていました。

そこで、すばやく機能させるために、代わりにフォーム タグを使用してフォームを記述し、@Url.Action を使用して必要なアクションを作成しました。

于 2013-11-19T15:24:35.867 に答える