web-dev-qa-db-ja.com

ASP.NET MVC 4は発行されたhtml名とIDをオーバーライドします

@Html.HiddenForによって作成されたhtml入力の発行名を変更しようとしています。

私がこれを使用しているコード:

@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }

これはidで機能しますが、名前では機能しません。今はidを本当に気にしません。nameを変更する必要があります。これはターゲットサーバーにポストバックされるためです。

ある

  • モデルのSomePropertyに適用できるプロパティは?
  • Html.HiddenFornameプロパティをオーバーライドする方法は?

それとも、私は平凡な<input ...>を手作業で行う必要がありますか?

52
Snake

<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番目のブラウザは気にしませんが...)

105
nemesv

使用する場合:

@ Html.HiddenFor(e => e.SomeProperty、new {@id = "some_property"、@Name = "some_property"});

@Nameの大文字の「N」に注意してください。動作します。

36
unjuken

Name属性を具体的にオーバーライドしても機能しない理由について興味がありました。大文字にしない限り(つまりnew {@Name = 'somename'})、機能しないようです。他の人が指摘したように、これは重複する名前属性を生成し、Chromeをクリーンアップするため、機能します。

最新のMVCソースコードを見て、何が起こっているのかを調べました。 DefaultHtmlGenerator.csGenerateInputメソッドからの次のスニペットを検討してください。

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の最後の呼び出しによってオーバーライドされ、変数fullNameGetFullHtmlFieldNameメソッドから。

モデルバインダーで動作することを保証するために、ポストバックで使用される名前を制御することと関係があると推測して、この動作を強制する理由を理解しています。

いずれにせよ、これを実現するために、入力要素を手動で構築し、カミソリビューヘルパーを使用しないでください。

3
sovemp

私のために働いたことはありません(aspnet.core)

プレーンを使用しました

<input type="hidden" id="@myid" name="@myname" value="@Model.prop" />

そして魅力のように働いた。 HtmlHelper HiddenForModelは不要です。

0
Carl Verret