web-dev-qa-db-ja.com

クエリ文字列でHtml.BeginFormを使用する

私のURLは次のようになります:

customer/login?ReturnUrl=home

ログインビューでは、このパターンのコードを使用して正常に動作しています。

@using(Html.BeginForm())
{
   ...
}

これは、次のhtmlを魔法のように生成します

<form action="customer/login?ReturnUrl=home" method="post">

しかし、今、フォームに属性(たとえば、data-id="something")を追加する必要があります。どうやってやるの?クエリ文字列がない場合は、次のようなことができることを知っています。

@using(Html.BeginForm(action, controller, FormMethod.Post, 
                      new { data_id="something" }))

しかし、htmlにあるはずのクエリ文字列を追加する方法がわかりません。

<form action="customer/login?ReturnUrl=home" method="post" data-id="something">

<form>を直接使用することを考えましたが、変数であるクエリ文字列を指定する方法がわかりません。そして、Html.BeginFormでそれを達成する方法がわかりません。任意のヒントをいただければ幸いです。

解像度:

今のところ、次のヒントで<form>を使用しました Viewで現在のURL値を取得する方法 。結果のビューは次のようになります

<form action="@Request.Url.PathAndQuery" data-id="something" method="POST">

ただし、このためにBeginFormのオーバーロードメソッドがあると便利です。

30
Tae-Sung Shin

私はこれが質問に直接答えないと思いますが、なぜ単純な古い形式のタグを使用しないのですか?

_ <form action='customer/[email protected]["ReturnUrl"]' method="post" data-id="something">
_

または、パスとクエリ文字列でフォームをレンダリングするカスタムHtmlHelperExtensionを作成できます。このHtmlHelperExtensionでは、クエリ文字列値を反復処理し、routeValueDictionaryを設定して、Html.BeginFormコンストラクターに渡すことができます。

拡張性のあるものが必要ない場合は、@Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});を使用して、Html.BeginFormのオーバーロードされたコンストラクタを使用できます。

16
arviman

ここに私のために働いた方法があります

Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post)

メソッドのオーバーロードに問題があるように見えましたが、何かを指定することで、うまくいくようです...

19
JustMaier

クエリ文字列からRouteValueDictionaryを作成するには:

RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key]));

次に、Html.BeginFormで使用できます。

Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> { { "autocomplete", "off" } })
17
conical

reflectorを使用してコードを確認し、

BeginForm()は、rawUrlを最終フォームに直接渡します。 BeginFormの他のオーバーロードは、クエリ文字列を削除するヘルパーユーティリティを通過します。

3
savagepanda

@using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))を試してください

BeginForm()を使用したかのように、デフォルトのロジックを使用してURLを構築する必要があります

(そのような場合でもそれを試したことはありませんが、うまくいくと信じています)

0

これは私のために働く:

@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get))

明示的なルート値とメソッドが必要です...

0
Sanjeev

他の属性も追加したい場合に備えてください。以下のコードを使用

@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))
0
Saad A