.NET 4 MVC 2 验证,带有注释警告而不是错误

Posted

技术标签:

【中文标题】.NET 4 MVC 2 验证,带有注释警告而不是错误【英文标题】:.NET 4 MVC 2 Validation with annotations warning instead of error 【发布时间】:2011-09-17 18:00:47 【问题描述】:

我使用 .NET 4 和 MVC 2 来验证注解。是否有(简单)解决方案可以返回 警告 而不是 错误?这样我就可以得到一个绿色或黄色的框,上面写着“你不应该使用这个内容,但你可以使用”这样的消息。

提前非常感谢! :)

编辑: 请注意,我已经能够通过ErrorMessage 抛出错误,但我另外想要WarningMessageInfoMessage 之类的东西,这样用户只会收到警告但可能会继续。有解决办法吗?

伪代码将是: (请注意“伪”,因为WarningMessage(很遗憾)不是一个有效的类)

public class Person

  [StringLength(50)]
  [Required(ErrorMessage = "You MUST enter a name!")]
  public string Name  get; set; 

  [Required(WarningMessage = "It is recommended to fill out the age but you may leave it out)]
  public int Age  get; set; 

是的我想把它集中在我的验证类中——而不是在 .js 文件的某个地方。

【问题讨论】:

用几行 jQuery DIY。 我认为在我的验证类中控制行为会很好(并且在那里)。 @Jaques le Fraque,你的想法真的很有趣!你做到了吗? @Fabio,没有“我还没有找到我要找的东西”,很遗憾。 谢谢!如果我找到任何东西会建议! 【参考方案1】:

我将首先快速评论说我不确定这是否是个好主意!

“必需”属性具有特定的“特征”——当人们将其包含在他们的属性中时,他们会期望它的某些东西。如果您想使用属性来定义此行为,请尝试更准确地描述您正在做的事情,而不是您的:

[Required(WarningMessage = "It is recommended to fill out age...")]
public int Age  get; set; 

我会:

[PreSubmitWarningMessage("It is recommended to fill out age...")]
public int Age  get; set; 

您可以创建自己的属性来影响请求的处理方式,但这不会像标准 MVC 属性那样传播到客户端验证。

要让它与 MVC 配合得很好,您需要将其创建为 Action Filter - 特别是通过实现 ActionFilterAttribute 并覆盖 OnActionExecuted 方法:

public class PreSubmitWarningMessage : ActionFilterAttribute
    
    private string _warningMessage;

    public PreSubmitWarningMessage(string warningMessage)
    
        _warningMessage = warningMessage;
    

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    
        // stuff you do here will happen before the 
        // controller action is executed.

        // you can compare the private warning message 
        // to the metadata in filterContext
    

您可以在这里做几件事,我不确定最佳实践是什么,但最重要的是,您可以访问 filterContext 中的模型,因此您可以更改控制器操作的行为,更新如果您的警告条件(在这种情况下,该字段是必需的),则您的视图模型到某个状态。

人们可能会提出仅扩展RequiredAttribute 的理由,但我认为说您的新属性IS 是RequiredAttribute 是不正确的,因此继承在概念上是不正确的。

【讨论】:

【参考方案2】:

我不确定这会如何工作。如果用户没有输入数据,并且数据被接受,那么您将转到其他页面,他们将永远不会看到警告消息。这意味着您要么必须不进行,向他们显示警告(然后要求他们做其他事情才能进行),要么您必须弹出一个对话框或警报,要求他们批准继续。

从可用性的角度来看,这两者都不是一个很好的解决方案。

您如何建议用户实际看到警告?

【讨论】:

【参考方案3】:

我不确定 DataAnnotations 是否会在这方面有所帮助。您始终可以使用自定义客户端验证。创建一个自定义类将错误消息传递给客户端

【讨论】:

【参考方案4】:

我认为这里没有任何适当的需要使用注释和验证数据。最好的办法是编写一个 JS 函数,当用户给出一些输入但不符合某些输入条件时显示工具提示类型的消息,因为无论如何你都会允许它。数据注解的基本目的是不允许不符合定义条件的输入到达数据库。

【讨论】:

【参考方案5】:

所有验证属性都有ErrorMessage 属性。您可以提供自定义错误消息

public class Product


    [StringLength(50)]
    [Required(ErrorMessage = "Your user friendly message")]
    public string Name  get; set; 


然后更改错误消息的 CSS 样式。

/* Styles for validation helpers
-----------------------------------------------------------*/
.field-validation-error

    color: #ff0000;/*change the color*/


/*Other validation related styles*/

【讨论】:

我已经这样做了。因此,如果在您的示例中名称超过 50 个字符,则验证将完全阻止将此产品添加到数据库中。我想要的是它允许 用户添加超过 50 个字符的产品,但之前向他发送了 警告。类似 WarningMesssage = "..." 谢谢! @Jaques 是的。假设您允许用户输入更多字符并发出警告。用户放弃警告但系统无法处理? 我允许用户输入超过 50 个字符,警告他们,但用户可以继续输入例如 60 个字符。数据库能够处理这个问题。

以上是关于.NET 4 MVC 2 验证,带有注释警告而不是错误的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 之外使用 ASP.Net MVC 数据注释

ASP.Net MVC 3客户端验证,带有3个选项卡表单

带有注释的 Spring MVC 验证

ASP.NET MVC:通过 DataAnnotation 进行自定义验证

ASP .NET MVC在每个字段级别禁用客户端验证

使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?