web-dev-qa-db-ja.com

ASP.NET Core1.0のViewModelメタデータからプレースホルダーを入力します

ビューモデルの[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値を確認できる唯一の場所は、やや隠されています。

enter image description here

だから私は2つの質問があります。それを行うためのよりスマートな方法はありますか?ビューモデルメタデータからプレースホルダーを取得するのは悪い習慣ですか?つまり、かみそりファイルで明示的に指定する必要がありますか?

13
regnauld

簡単なテストを行ったところですが、正しく理解していれば、デフォルトの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>

結果:

enter image description here

31
Sock
Html.TextBoxFor(t => t.Tags, new { placeholder = Html.DisplayNameFor(m => m.Tags) })
0
caras