0

requiredフィールドを必須にするためにクラスを適用するように私に言う人が多すぎます。古き良きrequired属性は必要ありません。検証用に新しい属性セットが必要です。これは私が成功せずに試したことです:

これは私のエディター テンプレートです。

@using Comair.RI.UI.Core
@{
    var list = this.GetModelSelectList();
    var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@if (ViewData.ModelMetadata.IsRequired)
{
    //var att = "data-val-required=\"string.Format("The {0} field is required", ViewData.ModelMetadata.DisplayName)
    var att = string.Format("The {0} field is required.", ViewData.ModelMetadata.DisplayName);
    @Html.DropDownListFor(m => Model, listWithSelected, " - select - ", 
    new Dictionary<string, object> {{"data-val-number=", "The field " + ViewData.ModelMetadata.DisplayName + " must be a number."}, {"data-val", true}, {"data-val-required", att}})
}
4

1 に答える 1

1

対応するビュー モデル プロパティを必要な検証属性で装飾するだけです。例えば:

public class Core
{
    [Required]
    public int? Id { get; set; }
}

その後:

@using Comair.RI.UI.Core
@{
    var list = this.GetModelSelectList();
    var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@if (ViewData.ModelMetadata.IsRequired)
{
    @Html.DropDownListFor(m => m.Id, listWithSelected, " - select - ")
}

また、ヘルパーに渡す最初の引数はDropDownListFor、単純なスカラー プロパティ タイプ (整数や文字列など) を指すラムダ式を表す必要があることに注意してください。そのため、この例では、Required 属性をビュー モデルの対応する Id プロパティに適用し、それに DropDownList をバインドする方法を説明しました。次に、ヘルパーは、目立たない検証が機能するために必要なすべての属性を生成するように注意します。あなたの例では、ドロップダウンリストをm => Model最初に誤ったラムダ式であるモデルにバインドしていました。これModelは、外部から値をキャプチャしているためです。さらに悪いことに、ヘルパーとの互換性があまりない複雑な型です。

1 つだけ知っておくべきことがあります。このテンプレートがフォーム (Html.BeginFormまたはAjax.BeginForm) 内で呼び出されない場合、ヘルパーは などのクライアント側の検証属性を発行しませんdata-required。FormContext が存在しない場合はインスタンス化することで、この問題を回避できます。

@if (ViewContext.FormContext == null)
{
    ViewContext.FormContext = new FormContext();
}
@Html.DropDownListFor(m => m.Id, listWithSelected, " - select - ")

これにより、ヘルパーが常に検証属性を発行することが保証されます。

于 2013-01-22T11:04:57.253 に答える