ビューモデルの[Display(Prompt = "This is the placeholder")]
属性から入力プレースホルダーを取得するように、組み込みのasp-for
タグヘルパーを設定することは可能ですか。
[Display(Name="Name", Prompt = "This is the placeholder")]
public string Name { get; set; }
MVC 5では、エディターテンプレートにロジックを追加し、ViewData.ModelMetadata.Watermark
プロパティを確認することで、これを実現できます。例えば:
@model string
@{
Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "form-control");
if (!string.IsNullOrWhiteSpace(ViewData.ModelMetadata.Watermark))
{
htmlAttributes.Add("placeholder", ViewData.ModelMetadata.Watermark);
}
}
@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes)
@Html.ValidationMessage("", "", new { @class = "text-danger" })
しかし、ASP.NET Core 1.0では、新しいタグヘルパーアプローチの使用を開始したいと思います。デフォルトでは、ビルドインasp-for
ヘルパーは単にPrompt
属性値を無視します。
asp-for
属性の独自のカスタム実装を持っています。 my-asp-for
はオプションであり、おそらく保守性と追加のロジックの再利用のためにそれを使用することになります。ただし、Watermark
プロパティはModelMetadata
に存在しなくなります。つまり、For.Metadata.Watermark
のようなものはありません。
asp-for
ヘルパーでPrompt
値を確認できる唯一の場所は、やや隠されています。
だから私は2つの質問があります。それを行うためのよりスマートな方法はありますか?ビューモデルメタデータからプレースホルダーを取得するのは悪い習慣ですか?つまり、かみそりファイルで明示的に指定する必要がありますか?
簡単なテストを行ったところですが、正しく理解していれば、デフォルトのVSテンプレートを使用してすぐに使用できるようです。
モデル:
public class LoginViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email", Prompt = "[email protected]")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
スニペットを表示:
<div class="form-group">
<label asp-for="Email" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
結果:
Html.TextBoxFor(t => t.Tags, new { placeholder = Html.DisplayNameFor(m => m.Tags) })