私の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
のオーバーロードメソッドがあると便利です。
私はこれが質問に直接答えないと思いますが、なぜ単純な古い形式のタグを使用しないのですか?
_ <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のオーバーロードされたコンストラクタを使用できます。
ここに私のために働いた方法があります
Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post)
メソッドのオーバーロードに問題があるように見えましたが、何かを指定することで、うまくいくようです...
クエリ文字列から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" } })
reflectorを使用してコードを確認し、
BeginForm()は、rawUrlを最終フォームに直接渡します。 BeginFormの他のオーバーロードは、クエリ文字列を削除するヘルパーユーティリティを通過します。
@using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))
を試してください
BeginForm()
を使用したかのように、デフォルトのロジックを使用してURLを構築する必要があります
(そのような場合でもそれを試したことはありませんが、うまくいくと信じています)
これは私のために働く:
@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" }))