【问题标题】:Is it possible to use 2 remote validation attributes on a single property?是否可以在单个属性上使用 2 个远程验证属性?
【发布时间】:2011-08-19 16:42:57
【问题描述】:

是否可以在视图模型中的单个属性上使用 2 个远程验证属性?

我想做的是执行 2 项检查,首先是数据库中存在给定的用户 ID,其次是用户尚未在系统上设置帐户。

我想我总是可以创建一个包含两个测试的自定义属性,但如果可能的话,我宁愿只使用开箱即用的功能并将验证链接在一起。

我不能真正将逻辑组合成一个 JsonResult,因为我需要根据验证失败的方式有不同的错误消息,并且 AFAIK 不可能返回带有验证结果的错误消息?

【问题讨论】:

    标签: asp.net-mvc-3 unobtrusive-validation


    【解决方案1】:

    实际上,您可以使用 MVC3 远程验证返回一个独特的错误消息。例如,请参阅 http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspxhttp://deanhume.com/Home/BlogPost/mvc-3-and-remote-validation/51

    【讨论】:

    • 啊,我怎么错过了返回字符串和布尔值的能力
    【解决方案2】:

    我不确定您对“开箱即用的功能”有何期望,但您可以创建两个足够简单的属性。在 MVC 3 中,您还有机会从 IValidatableObject 派生模型并实现 Validate 方法。如果您发现需要,后者使您能够在彼此的上下文中对多个属性执行多个验证。

    以下是实现 ValidationAttribute 和装饰属性的方法。您将需要其中两个,因此我将其命名为 UsernameExistsAttribute,我们假设您创建了另一个名为 AccountAlreadySetupAttribute 并覆盖相同的 IdValid 方法。

    public class UsernameExistsAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if((string)value == "Bob")
                return false;
            else
                return true;
        }
    }
    

    在您的视图模型中,您可以像这样装饰属性:

    public class FreakinSweetViewModel
    {
        [UsernameExists(ErrorMessage="Username exists")]
        [AccountAlreadySetup(ErrorMessage="Account is not setup")]
        public string Username { get; set; }
    }
    

    这会将您的客户端和服务器端验证连接到 MVC 3 框之外。

    【讨论】:

    • 感谢您的详细回复,但我希望有一种不需要属性扩散的方法,尽管我喜欢自定义属性将语义清晰注入模型的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2022-01-05
    • 2017-12-14
    • 2014-08-06
    • 1970-01-01
    • 2011-06-15
    • 2016-07-07
    相关资源
    最近更新 更多