数据说明,为什么布尔prop.IsRequired总是等于真 [英] Data annotations, why does boolean prop.IsRequired always equal true

查看:159
本文介绍了数据说明,为什么布尔prop.IsRequired总是等于真的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含没有 [必需] 属性的布尔模型

 公共BOOL IsOptedIn {搞定;组; }

我已经重写 Object.cshtml 如下,并正在使用 @ Html.EditorForModel()来生成自己的状态

  @ {
    VAR性能= ViewData.ModelMetadata.Properties
                        。凡(道具=> prop.ShowForEdit和放大器;&安培;!ViewData.TemplateInfo.Visited(丙));
}@foreach(在性能VAR道具)
{
    变种hasModelStateError = ViewContext.ViewData.ModelState.Any(M => m.Key == prop.PropertyName)
        &功放;&安培; ViewContext.ViewData.ModelState [prop.PropertyName] .Errors!= NULL
        &功放;&安培; ViewContext.ViewData.ModelState [prop.PropertyName] .Errors.Count> 0;
    < D​​IV CLASS =控制组
        @(hasModelStateError错误:?的String.Empty)
        @ prop.PropertyName.ToLower()>
        @if(prop.IsReadOnly)
        {
            < B> @ prop.GetDisplayName()< / B>
            @ Html.Display(prop.PropertyName)
        }
        否则,如果(prop.HideSurroundingHtml)
        {
            @ Html.Editor(prop.PropertyName)
        }
        其他
        {
            <标签类=控制标签>
                @ prop.GetDisplayName()
                @if(prop.IsRequired)
                {
                    <跨度类=必需> * LT; / SPAN>
                }
            < /标签>
            < D​​IV CLASS =控制>
                @ Html.Editor(prop.PropertyName)
                @if(hasModelStateError)
                {
                    < p =类警报警报块>
                        @ Html.ValidationMessage(prop.PropertyName)
                    &所述; / P>
                }
                @if(!string.IsNullOrWhiteSpace(prop.Description))
                {
                    < p =班帮助块>
                        @ prop.Description
                    &所述; / P>
                }
            < / DIV>
        }
    < / DIV>
}

我发现,在我的模型布尔变量的要求总是被标记。这是为什么,我怎么能阻止它的发生?


解决方案

  DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = FALSE;

的Global.asax 将此行添加到您的的Application_Start 方法。默认情况下MVC增加了 [必需] 属性的非空值类型(因为你不能转换进入一个布尔,它必须是一个布尔)。

I have a model containing a boolean with no [Required] attribute

public bool IsOptedIn { get; set; }

I have overriden Object.cshtml as follows and am using @Html.EditorForModel() to generate my form

@{
    var properties = ViewData.ModelMetadata.Properties
                        .Where(prop => prop.ShowForEdit && !ViewData.TemplateInfo.Visited(prop));    
}

@foreach (var prop in properties)
{
    var hasModelStateError = ViewContext.ViewData.ModelState.Any(m => m.Key == prop.PropertyName) 
        && ViewContext.ViewData.ModelState[prop.PropertyName].Errors != null
        && ViewContext.ViewData.ModelState[prop.PropertyName].Errors.Count > 0;  
    <div class="control-group 
        @(hasModelStateError ? "error" : string.Empty) 
        @prop.PropertyName.ToLower()">
        @if (prop.IsReadOnly)
        {
            <b>@prop.GetDisplayName()</b>
            @Html.Display(prop.PropertyName)
        }
        else if (prop.HideSurroundingHtml)
        {
            @Html.Editor(prop.PropertyName)                    
        }
        else
        {
            <label class="control-label">
                @prop.GetDisplayName()
                @if (prop.IsRequired)
                {
                    <span class="required">*</span> 
                }            
            </label>                     
            <div class="controls">
                @Html.Editor(prop.PropertyName)             
                @if (hasModelStateError)
                {
                    <p class="alert alert-block">
                        @Html.ValidationMessage(prop.PropertyName)
                    </p>
                }
                @if (!string.IsNullOrWhiteSpace(prop.Description))
                {
                    <p class="help-block">
                        @prop.Description
                    </p>              
                }                    
            </div>
        }            
    </div>     
}

I am finding that bools in my model are always being marked as required. Why is this and how can I stop it happening?

解决方案

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Add this line to your Application_Start method from Global.asax. By default MVC adds [Required] attribute to non-nullable value types (because you can't convert a null into a bool, it must be a bool).

这篇关于数据说明,为什么布尔prop.IsRequired总是等于真的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆