0

ASP.NET MVC は初めてですが、これについての説明を見つけることができませんでした。

私の質問は、対valueを使用したときに生成された HTMLの属性の違いに関するものです。@HtmlTextBox()@HtmlTextBoxFor()

次のように<input>使用するための初期値を設定できます。@Html.TextBox()

@Html.TextBox("Phone", "Initial Value", htmlAttributes: new { id = "txt_phone" })

生成された HTML は、期待どおりのものです。

<input id="txt_phone" name="Phone" type="text" value="Initial Value" />

value上記の生成された属性に注意してください。

使い方@HtmlTextBoxFor()が違います。私の見解では非常に単純なモデルがあることに注意してください。というPhoneプロパティがありStringます。

を使用して初期値を設定する試みを次に示します@Html.TextBoxFor()

@Html.TextBoxFor(x => x.Phone, htmlAttributes: new { id = "txt_phone", value="Initial Value" })

valueただし、生成された HTML には属性が反映されません。

<input id="txt_phone" name="Phone" type="text" value="" />

value最初の質問は、「生成された HTML が属性の「初期値」テキストを反映していないのはなぜですか?」というものです。

多くの人が知っているように、初期値を設定する「正しい方法」@HtmlTextBoxFor()は次のようになります。

@Html.TextBoxFor(x => x.Phone, htmlAttributes: new { id = "txt_phone", Value = "Initial Value" })

しかし、生成された HTML を見てください。

<input Value="Initial Value" id="txt_phone" name="Phone" type="text" value="" />

ご覧のとおり、Value(大文字の V で)value属性を生成しますが、小文字の v と空の文字列で属性を生成します!

私の 2 番目の質問は@Html.TextBoxFor()、大文字の V を必要とするのに、空の文字列を含むValue小文字の v を生成するのはなぜですか?value

ありがとう

4

1 に答える 1

1

「なんで?」の答え。これは、値を渡す方法ではないためです。HTML ヘルパーは、かなり複雑なロジックを使用してフィールドの値を決定します。値はさまざまな状況に応じて変化するため、手動で値を追加しようとしてもほとんど無視されます。

Razor が最初に値を探す場所は、とModelStateからのデータで構成される です。次に、ビューの を調べます。最後に、「デフォルト」値にフォールバックします。これは、デフォルト値を指定できる非ヘルパーにのみ適用されます。ヘルパーで同じことができない理由は、ヘルパーが実際のプロパティにバインドされているためです。したがって、たとえそれがorまたは something のデフォルトであっても、そのプロパティの値を取ります。RequestViewDataViewBagModelForFornull0

長くても短くても、プロパティにバインドし特定の値にデフォルト設定する場合は、その値をプロパティのデフォルトにする必要があります。例えば:

private string phone;
public string Phone
{
    get { return phone ?? "Initial Value"; }
    set { phone = value; }
}

現在、プロパティ自体は、以前に設定されていない場合は常に「初期値」を返すため、フォーム フィールドも同様です。

于 2015-09-29T16:33:29.493 に答える