.NET 4 MVC 2使用注释警告而不是错误进行验证

时间:2011-06-18 11:36:03

标签: c# asp.net asp.net-mvc asp.net-mvc-2 validation

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

非常感谢提前! :)

修改:
请注意我已经能够通过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文件中的某个地方。

5 个答案:

答案 0 :(得分:2)

我会先快速评论一下,我不确定这是不是一个好主意!

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

[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是正确的,所以继承在概念上是不正确的。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

所有验证属性都具有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*/

答案 3 :(得分:0)

我认为没有必要在这里使用注释和验证数据。这里要做的最好的事情是编写一个JS函数,当用户提供一些输入失败的输入时,显示工具提示类型的消息,因为你总是允许它。数据注释的基本目的是不允许未定义条件的输入到达db。

答案 4 :(得分:0)

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