2010-09-18 77 views
0

我正在使用MVC 2.我有关于客户端和服务器端验证的问题。可以说,我有一个类,它有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; } 

在我看来,我只有Property1和财产2,使他们文本框。我没有将Property3添加到视图中(但它被标记为如上所需)。如果我没有在文本框中输入任何内容,那么客户端验证将失败。如果我在文本框中插入文本,即使Property3没有设置值,客户端是否会传递?它会在服务器端失败吗?

我点击提交按钮后,服务器端出现问题。这里是我的代码为我创建行动:

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

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

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

回答

1

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

+0

谢谢。看到我更新的问题,也许你可以更多地了解一些情况。我现在就去阅读那篇文章。 – 2010-09-18 10:29:38

+0

原因是因为验证是在模型绑定期间执行的。在此模型绑定发生后,您正在设置所需的属性**。一种可能的解决方法是使用'TryUpdateModel'方法而不是将其作为动作参数传递。 – 2010-09-18 10:35:22

+0

谢谢你Darin。只是最后一个问题,我是否正确地做了这件事,把所有事情都放在一个尝试和抓住?通常在Web表单中,我将检查应用程序是否为空,如if(application == null)。 – 2010-09-18 10:38:05

相关问题