【问题标题】:How to add custom errors in a mvc editortemplate?如何在 mvc 编辑器模板中添加自定义错误?
【发布时间】:2013-11-05 02:53:37
【问题描述】:

我有一个看起来像这样的 MVC 模型类:

[ValidateNewRegistration]
public class NewRegistrationModel {

    [System.ComponentModel.DisplayName("Profile Display Name")]
    [Required(ErrorMessage = "Display Name must be specified.")]
    [StringLength(50)]
    public string DisplayName { get; set; }

    [System.ComponentModel.DisplayName("Email Address")]
    [Required(ErrorMessage = "Email address must be specified.")]
    [RegularExpression("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$",
              ErrorMessage = "The email address you specified is invalid.")]
    [StringLength(100)]
    public string EmailAddress1 { get; set; }

}

在我看来,我有这个:

    @Html.ValidationSummary()
    @Html.EditorForModel()

我了解如何使用元数据来标记属性,但我想做的是实现我自己的编辑器模板,其中包含两个字段......名字和姓氏,至少将用于我的网站中有 1/2 打位置。

如何添加错误消息,以便它们出现在验证摘要中,但以包含在 EditorTemplate 中的方式出现?

我一直在寻找的是能够将“[UIHint("--Editor Template--")]”放入类中,并让编辑器模板自包含足以发出它的 onw 错误消息对于表单域。这样我就不必将元数据添加到显示 [Required...] 或 [RegularExpression...] 的类中。我的最终目标是一个看起来像这样的类:

[ValidateNewRegistration]
public class NewRegistrationModel {

    [System.ComponentModel.DisplayName("Profile Display Name")]
    [UIHint("DisplayName")]
    public string DisplayName { get; set; }

    [System.ComponentModel.DisplayName("Email Address")]
    [UIHint("EmailAddress")]
    public string EmailAddress1 { get; set; }

    [System.ComponentModel.DisplayName("Email Address (confirm)")]
    [UIHint("EmailAddress")]
    public string EmailAddress2 { get; set; }

}

【问题讨论】:

    标签: c# .net asp.net-mvc templates razor


    【解决方案1】:

    此处已提出类似问题:Is there a way to reuse data annotations?

    查看那里的解决方案,如果您需要任何具体

    方面的帮助,请发表评论
        class UIHintAttribute : ValidationAttribute
    {
        public string Field { get; set; }
    
        public UIHintAttribute(string field)
        {
            Field = field;
        }
        public override bool IsValid(object value)
        {
    
            if (Field == "DisplayName")
            {
                if (new RequiredAttribute { ErrorMessage = "DisplayName cannot be blank." }.IsValid(value) && new StringLengthAttribute(50).IsValid(value))
                    return true;
    
                return false;
            }
            if (Field == "EmailAddress")
            {
                if (new RequiredAttribute { ErrorMessage = "Email address cannot be blank." }.IsValid(value)
                    && new RegularExpressionAttribute("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$") { ErrorMessage = "The email address you specified is invalid." }.IsValid(value)
                        && new StringLengthAttribute(100).IsValid(value))
                    return true;
    
                return false;
            }
    
            // Needs to return true by default unless Required exists
            return true;
        }
    }
    

    现在您应该可以按照自己的方式使用它了。

    编辑:

    从长远来看,我正在寻找的是能够将 "[UIHint("--Editor Template--")]" 到类中,并具有 编辑器模板自包含足以发出它的 onw 错误 表单字段的消息。这样我就不必将元数据添加到 显示 [Required...] 或 [RegularExpression...] 的类。

    上面的课程将使以下事情成为可能:

    public class NewRegistrationModel {
    
        [System.ComponentModel.DisplayName("Profile Display Name")]
        [UIHint("DisplayName")]
        public string DisplayName { get; set; }
    
        [System.ComponentModel.DisplayName("Email Address")]
        [UIHint("EmailAddress")]
        public string EmailAddress1 { get; set; }
    
        [System.ComponentModel.DisplayName("Email Address (confirm)")]
        [UIHint("EmailAddress")]
        public string EmailAddress2 { get; set; }
    
    }
    

    【讨论】:

    • 这不是问题的答案。我的问题是,如何创建带有自定义错误的 EditorTemplate?
    • 您的代码实际上不起作用。框架将寻找它自己的 UIHint 属性版本,而不是它的覆盖。但是,ValidationAttribute 是要走的路。当系统没有选择正确的编辑器时,我会使用 UIHint,并使用 [EmailAddressValidator] 来输入电子邮件地址的验证逻辑。这至少将验证逻辑集中在属性级别。
    • @Elenesski 我已经更正了UIHintAttribute 类中的拼写错误,请检查更新后的代码如果您仍然发现它不起作用,请给我一个错误说明,以便我可以帮助您,如果你也能解释一下ValidateNewRegistrationAttribute,那就太好了
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 2017-10-20
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多