首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC模型需要true

MVC模型需要true
EN

Stack Overflow用户
提问于 2011-01-19 07:17:55
回答 14查看 59.3K关注 0票数 91

有没有一种方法可以通过数据注释来要求布尔型属性设置为true?

代码语言:javascript
复制
public class MyAwesomeObj{
    public bool ThisMustBeTrue{get;set;}
}
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-01-19 07:50:37

您可以创建自己的验证器:

代码语言:javascript
复制
public class IsTrueAttribute : ValidationAttribute
{
    #region Overrides of ValidationAttribute

    /// <summary>
    /// Determines whether the specified value of the object is valid. 
    /// </summary>
    /// <returns>
    /// true if the specified value is valid; otherwise, false. 
    /// </returns>
    /// <param name="value">The value of the specified validation object on which the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/> is declared.
    ///                 </param>
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");

        return (bool) value;
    }

    #endregion
}
票数 52
EN

Stack Overflow用户

发布于 2012-01-27 23:51:24

我将为服务器端和客户端创建一个验证器。使用MVC和不显眼的表单验证,只需执行以下操作即可实现:

首先,在您的项目中创建一个类来执行服务器端验证,如下所示:

代码语言:javascript
复制
public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
        return (bool)value == true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "The " + name + " field must be checked in order to continue.";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = String.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage,
            ValidationType = "enforcetrue"
        };
    }
}

然后,在模型中注释相应的属性:

代码语言:javascript
复制
[EnforceTrue(ErrorMessage=@"Error Message")]
public bool ThisMustBeTrue{ get; set; }

最后,通过将以下脚本添加到视图来启用客户端验证:

代码语言:javascript
复制
<script type="text/javascript">
    jQuery.validator.addMethod("enforcetrue", function (value, element, param) {
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("enforcetrue");
</script>

注意:我们已经创建了一个方法GetClientValidationRules,它将我们的注释从我们的模型推送到视图。

如果使用资源文件为国际化提供错误消息,请删除FormatErrorMessage调用(或仅调用基)并调整GetClientValidationRules方法,如下所示:

代码语言:javascript
复制
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    string errorMessage = String.Empty;
    if(String.IsNullOrWhiteSpace(ErrorMessage))
    {
        // Check if they supplied an error message resource
        if(ErrorMessageResourceType != null && !String.IsNullOrWhiteSpace(ErrorMessageResourceName))
        {
            var resMan = new ResourceManager(ErrorMessageResourceType.FullName, ErrorMessageResourceType.Assembly);
            errorMessage = resMan.GetString(ErrorMessageResourceName);
        }
    }
    else
    {
        errorMessage = ErrorMessage;
    }

    yield return new ModelClientValidationRule
    {
        ErrorMessage = errorMessage,
        ValidationType = "enforcetrue"
    };
}
票数 131
EN

Stack Overflow用户

发布于 2013-07-19 23:13:37

我知道这是一个更老的帖子,但我想分享一个简单的服务器端方法来做到这一点。创建一个设置为true的公共属性,并将bool与该属性进行比较。如果您的bool未被选中(默认情况下为false),表单将不会验证。

代码语言:javascript
复制
public bool isTrue
{ get { return true; } }

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare("isTrue", ErrorMessage = "Please agree to Terms and Conditions")]
public bool AgreeTerms { get; set; }

剃刀代码

代码语言:javascript
复制
@Html.CheckBoxFor(m => Model.AgreeTerms, new { id = "AgreeTerms", @checked = "checked" })
<label asp-for="AgreeTerms" class="control-label"></label>
<a target="_blank" href="/Terms">Read</a>
<br />
@Html.ValidationMessageFor(model => model.AgreeTerms, "", new { @class = "text-danger" })
@Html.HiddenFor(x => Model.isTrue)
票数 97
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4730183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档