1

いくつかのブールオブジェクトを含むモデルがあります

    [DisplayName("Is student still at school")]
    //[ValidBoolDropDown("IsStillAtSchool")]
    public bool? IsStillAtSchool { get; set; }

いくつかのboolエディタードロップダウンテンプレートで実装されています

    @model bool?
@{
    int intTabIndex = 1;
    if (ViewData["tabindex"] != null)
    {
        intTabIndex = Convert.ToInt32(ViewData["tabindex"]);
    }
 }

 @{
    string strOnChange = "";
    if (ViewData["onchange"] != null)
    {
        strOnChange = ViewData["onchange"].ToString();
    }
}

<div class="editor-field">
    @Html.LabelFor(model => model): 

   @Html.DropDownListFor(model => model, new SelectListItem[] { new SelectListItem() { Text = "Yes", Value = "true", Selected = Model == true ? true : false }, new SelectListItem() { Text = "No", Value = "false", Selected = Model == false ? true : false }, new SelectListItem() { Text = "Select", Value = "null", Selected = Model == null ? true : false} }, new { @tabindex = intTabIndex, @onchange = strOnChange })

    @Html.ValidationMessageFor(model => model)
</div>

投稿では、デフォルトのモデル検証エラーが発生します

値「null」は、Is Studentstill at school(別名IsStillatSchool)には無効です。

カスタムValidationAttributeも実装しました

public class ValidBoolDropDown : ValidationAttribute
{
    public ValidBoolDropDown(string dropdownname) :base("Please Select for {0}")
    {

        DropDownName = dropdownname;
    }

    private string DropDownName;

    protected override ValidationResult IsValid(object value,ValidationContext validationContext)
    {


        var boolres = GetBool(validationContext);

        //if (!boolres.HasValue)
        //{
        //    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        //}

        return ValidationResult.Success;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name);
    }
    protected bool? GetBool(ValidationContext validationContext)
    {
        var propertyInfo = validationContext
                              .ObjectType
                              .GetProperty(DropDownName);
        if (propertyInfo != null)
        {
            var boolValue = propertyInfo.GetValue(validationContext.ObjectInstance, null);
            if (boolValue == null)
                return null;
            return boolValue as bool?;
        }
        return null;
    }
}

これは発生しますが上書きされ、この属性のModel.Value.Errorは引き続き失敗します

Glocal.asxの値型の自動必須フラグをオフにすることについていくつか見ました

  DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

しかし、これは機能していません。アプリのカスタムMetadataValidatorProviderを作成する場合ですか、それとも何か他のことが起こっていますか。

Adavanceに感謝します

4

1 に答える 1

1

さて、問題は行のドロップダウンテンプレートにありました

  @Html.DropDownListFor(model => model, new SelectListItem[] { new SelectListItem() { Text = "Yes", Value = "true", Selected = Model == true ? true : false }, new SelectListItem() { Text = "No", Value = "false", Selected = Model == false ? true : false }, **new SelectListItem() { Text = "Select", Value = "null", Selected = Model == null ? true : false}** }, new { @tabindex = intTabIndex, @onchange = strOnChange })

new SelectListItem(){Text = "Select"、Value = "null"、Selected = Model == null?真/偽}

プローブのSelectlistitemであること

デフォルトのモデルバインダーがフォームデータをモデルにバインドしようとすると、文字列「null」はnull(空のオブジェクト)と等しくありません

これがに変更されたら

new SelectListItem() { Text = "Select", Value = ""}

すべてがうまく機能し、検証属性がその仕事をするようになります

おかげで

ASP.NET MVC:DropDownList検証

:D

于 2012-04-21T01:05:58.403 に答える