Asp.net mvc 2 使用数据注释理解客户端和服务器端验证

Asp.net mvc 2 使用数据注释理解客户端和服务器端验证,asp.net-mvc-2,data-annotations,Asp.net Mvc 2,Data Annotations,我使用的是MVC2。我有一个关于客户端和服务器端验证的问题。假设我有一个类,它有3个属性: [Required(ErrorMessage = "Required")] public object Property1 { get; set; } [Required(ErrorMessage = "Required")] public object Property2 { get; set; } [Required(ErrorMessage = "Required")] public objec

我使用的是MVC2。我有一个关于客户端和服务器端验证的问题。假设我有一个类,它有3个属性:

[Required(ErrorMessage = "Required")]
public object Property1 { get; set; }

[Required(ErrorMessage = "Required")]
public object Property2 { get; set; }

[Required(ErrorMessage = "Required")]
public object Property3 { get; set; }
在我看来,我只有属性1和属性2,并使它们成为文本框。我没有将Property3添加到视图中(但它被标记为如上所述的required)。如果我没有在文本框中键入任何内容,那么客户端验证将失败。如果我在文本框中插入文本,即使Property3没有设置值,客户端也会通过吗?然后它会在服务器端失败吗

我遇到的问题是在单击submit按钮后服务器端出现的。以下是创建操作的代码:

public ActionResult CreateApplication(Application application)
{
   try
   {
      application.ApplicationStateID = 1;
      application.SubmitterEmployeeNumber = "123456";

      if (ModelState.IsValid)
      {
         // Code here
      }
   }
   catch
   {
   }
}

ApplicationStateID和SubmitterEmployeeNumber没有在客户端设置(它们都标记为必需),所以我在这里设置了它。设置它们之后,为什么服务器端的验证仍然会失败?

客户端验证将通过,因为没有相应的输入元素进行验证,服务器端验证将失败,因为您强制要求一个字段,并且此字段值未发布到服务器。您可以通过阅读了解模型验证的工作原理以及输入验证与模型验证之间的区别。

谢谢。看看我最新的问题,也许你能让我了解更多。我现在就去读这篇文章。原因是验证是在模型绑定期间执行的。您正在设置此模型绑定发生后所需的属性。一种可能的解决方法是使用
TryUpdateModel
方法,而不是将其作为操作参数传递。感谢您的帮助。最后一个问题,我是不是把所有的东西都放进了试抓游戏中,这样做对了?通常在web表单中,我会像if(application==null)一样检查应用程序是否为null。这里不需要
try/catch
,尤其是在使用
TryUpdateModel
时。您可以在
IsValid
条件中使用
try/catch
,因为这是您执行敏感操作的地方,如尝试更新数据库等。因此,我可以假设将有一个应用程序对象通过,并且它不会为null?我只是不想尝试在try catch之外设置类似ApplicationStateID的属性值,因为应用程序可能会作为null传递。它是否可以作为null传递?