ASP.NET MVC 3:「名前」属性をTextBoxForでオーバーライドする


99

を使用Html.TextBoxForしてname属性をオーバーライドすることは可能ですか?

私は成功しませんでした。クライアント側の検証を機能させるにはTextBoxForを使用する必要がありますが、理由はわからないので、生成されたものとは異なるテキストボックスの名前を指定する必要があります。

私は以下を試しました:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

これはIDでは機能しますが、名前では機能しません。これは可能ですか?

更新:TextBoxForのコードを調べます。簡単な方法はないようです。うまくいけば、誰かが私を間違っていると証明することができます。


「データ」のデータ型は何ですか
archil


2
それらの質問は、少し違う何かを求めています。また、これは3つのうちの古い方なので、重複することを意味すると思います。
Rob Stevenson-Leggett

回答:


234

ロブ、実際にはもっと簡単な方法があります。名前の代わりに、名前を使用します

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

11
大文字と小文字を区別します。@ highwingersです。この細部は時間を節約できる可能性があります。
anar khalilov 2013

3
Overkill ..名前がid X_X
Vladimirs

2
奇妙なことに、「id」は大文字と小文字を区別しません(Idとidで正常に機能します)が、「name」は区別しません。
Vladimirs

10
ASP.NET 4、提供してName二つの属性で結果を、Nameそしてname、モデルバインダー使用name
GSerg 2014年

1
しかし、名前が場合によってのみ異なる2つの異なる性質を扱うことは、メンテナンスの悪夢.....のためのレシピです
ジェームズ・マコーマック

41

名前に接頭辞を付けたいのでこれを求めていますか?もしそうなら、あなたはViewData.TemplateInfo.HtmlFieldPrefixあなたのコントローラーで設定することによってこれを行うことができます。

このことについては、Brad Wilsonのブログで多くのことを学びました。


これは勝者のようです!綺麗な。
Rob Stevenson-Leggett、

2
ええ、彼らはそれをうまくやらなかったと隠しました:)
ジェームズ・マコーマック'19年

これにより、頭痛とコードの重複がなくなりました。
davidXYZ 2014

13

EditorForには、name属性をパラメーターとして指定できるオーバーロードがあります。

 @Html.EditorFor(expression, null, name)

1
私がこの時間前に見つけた場合、私は時間を節約できたでしょう、ハハ
ジョニーカー

興味深いですが、DropDownListForのような同様のヘルパーのname属性にはオーバーロードがありません。html属性パラメーター(Nameに大文字のN)で指定する必要があります。
nmit026

8

EditorForをお試しください。プロパティタイプが文字列でなくてもテキストボックスがレンダリングされるようにしたい場合は、テンプレート名として文字列を渡すことができます。プロパティがすでに文字列の場合templatename、テキストボックスを明示的にレンダリングする必要がないため、を渡すことができますnull。idパラメータを明示的に必要としないことに注意してください。要素名から推測されます。そして、すべての検証はEditorForでまだアクティブです

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

ベンの答えは、あなたがHtml.Rawでラップする必要があることを除いて、私が探していたものを得ました

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4

Microsoft GOTCHAと呼ばれます

このように、名前を大文字で使用します

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

少し "unpretty" =)を試してください:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

それを行うための素晴らしい簡単な方法のようです。少しハッキーな場合:-)
ロブスティーブンソン-レゲット

ええと、この方法では、通常のHtml.TexBoxを使用するのではなく、静的な型付けが置換の後にとにかく削除されるためです
シャープジョニー

1

私にとっては、うまくいきます!お役に立てれば幸いです。

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

途中の2つの文字列パラメーターのどちらが機能するかはわかりませんが、両方を入力したときにのみ機能しました。


IdとNameです。これは私のために働いた。私は上記のすべての回答を調べましたが、どれもうまくいきませんでしたが、これは1です。ありがとうございます。
オリオン

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);。どうなるかわからないtemplateNameので、を使いましたnullhtmlFieldNameパラメータの名前を使用したため(私の場合、「IPMI」の代わりに「ipmi」)。それは私にとってはトリックでした。
BCdotWEB 2018年

0

この例では、アクセス許可に基づいてフォームフィールドを無効にしていましたが、まだ表示されていました。値をコントローラーに送信するための非表示フィールドがありましたが、EditorForに別のフィールド名が必要でした。モデル値の後の最初のパラメータは「名前」プロパティを表し、2番目は新しい名前です。

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

結果:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

0

単純にしてください。すでに提供しているIDを使用すると、「TextBoxFor」の代わりに「TextBox」メソッドを使用でき、クライアント側とサーバー側で正常に機能します。さらに、受け入れられた回答は機能しますが、ブラウザーを使用して検査すると、タグに重複したName属性が生成されます。以下のソリューションにはその問題はありません。

MvcHtmlString Html.TextBox(文字列名、文字列値、オブジェクトhtmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.