@Html.HiddenFor
によって作成されたhtml入力の発行名を変更しようとしています。
私がこれを使用しているコード:
@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }
これはid
で機能しますが、名前では機能しません。今はid
を本当に気にしません。name
を変更する必要があります。これはターゲットサーバーにポストバックされるためです。
ある
SomeProperty
に適用できるプロパティは?Html.HiddenFor
でname
プロパティをオーバーライドする方法は?それとも、私は平凡な<input ...>
を手作業で行う必要がありますか?
<input ...>
の代わりに Html.Hidden を使用する必要があります(またはHtml.HiddenFor
を手動で書きます)
@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })
強く型付けされたヘルパー(たとえば、名前がHiddenFor
のように「For」で終わるもの)の目標は、提供された式から入力名を推測することです。したがって、「カスタム」入力名が必要な場合は、名前を明示的に設定できるHtml.Hidden
などの通常のヘルパーをいつでも使用できます。
njukenからの回答 は間違っています HTMLを生成するため無効です。
そのソリューションを使用すると、[〜#〜] two [〜#〜]name
属性が生成されます。
<input Name="some_property" name="SomeProperty" id="some_property" type="hidden" value="test" />
したがって、Name="some_property"
[〜#〜] and [〜#〜]name="SomeProperty"
になります[〜#〜] invalid [〜#〜] HTMLは、入力に含めることができるのは[〜#〜] one [〜#〜]name
属性だからです! (ほとんどのブラウザはたまたま最初のName="some_property"
を使用し、2番目のブラウザは気にしませんが...)
使用する場合:
@ Html.HiddenFor(e => e.SomeProperty、new {@id = "some_property"、@Name = "some_property"});
@Nameの大文字の「N」に注意してください。動作します。
Name属性を具体的にオーバーライドしても機能しない理由について興味がありました。大文字にしない限り(つまりnew {@Name = 'somename'}
)、機能しないようです。他の人が指摘したように、これは重複する名前属性を生成し、Chromeをクリーンアップするため、機能します。
最新のMVCソースコードを見て、何が起こっているのかを調べました。 DefaultHtmlGenerator.cs
のGenerateInput
メソッドからの次のスニペットを検討してください。
var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
if (string.IsNullOrEmpty(fullName))
{
throw new ArgumentException(
...
}
var inputTypeString = GetInputTypeString(inputType);
var tagBuilder = new TagBuilder("input");
tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("type", inputTypeString);
tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);
ここでわかるように、問題は、提供する名前プロパティに関係なく、MergeAttribute
の最後の呼び出しによってオーバーライドされ、変数fullName
GetFullHtmlFieldName
メソッドから。
モデルバインダーで動作することを保証するために、ポストバックで使用される名前を制御することと関係があると推測して、この動作を強制する理由を理解しています。
いずれにせよ、これを実現するために、入力要素を手動で構築し、カミソリビューヘルパーを使用しないでください。
私のために働いたことはありません(aspnet.core)
プレーンを使用しました
<input type="hidden" id="@myid" name="@myname" value="@Model.prop" />
そして魅力のように働いた。 HtmlHelper HiddenForModelは不要です。