QueryStringを使用してHTML.BEGINFORMを使用します
-
27-10-2019 - |
質問
私の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>
次のヒントで 現在のURL値を表示する方法. 。結果のビューは次のように見えます
<form action="@Request.Url.PathAndQuery" data-id="something" method="POST">
しかし、の過負荷の方法があるといいでしょう BeginForm
このため。
解決
これは質問に直接答えるわけではないと思いますが、なぜ単純な古いフォームタグを使用しないのですか?
<form action='customer/login?ReturnUrl=@Request.QueryString["ReturnUrl"]' method="post" data-id="something">
または、パスとクエリストリングを備えたフォームをレンダリングするカスタムhtmlhelperextensionを作成することもできます。このhtmlhelperextensionでは、クエリストリング値を繰り返して、html.beginformコンストラクターに渡すroutevaluedictionaryに登録できます。
それほど拡張可能なものを望んでいない場合は、HTML.BEGINFORMのオーバーロードされたコンストラクターを使用するだけで使用できます。@Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});
他のヒント
これが私のために働いた方法です
Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post)
メソッドの過負荷に問題があるようなものでしたが、何かが何であるかを指定することで、うまく機能しているようです...
QueryStringから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" } })
リフレクターを使用してコードを見る、
beginform()は、ローールを最終フォームに直接渡します。 beginformの他のオーバーロードは、クエリ文字列を削除するヘルパーユーティリティを通過します。
これは私にとってはうまくいきます:
@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get))
明示的なルート値と方法が必要なものです...
他の属性も追加したい場合に備えてください。以下のコードを使用します
@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))
試す @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))
使用したように、デフォルトのロジックを使用してURLを構築する必要があります BeginForm()
(そのような場合はそれを試したことはありませんが、私はそれがうまくいくべきだと思います)