2011-01-11 43 views
2

我一直在阅读亲ASP.NET MVC 2.0框架,我有点困惑,我应该用我的验证,它应该去,以及如何确保我不必继续编写相同的代码。验证和Asp.net Mvc 2.0的最佳实践?

我的网站倾向于几乎所有与jQuery的ajax。所以我通常做的是为我的客户端提供jquery.validate,然后在服务器端再次进行一些检查。如果它会在服务器端失败,或者如果我有一个验证规则,我不能在客户端测试,那么我会返回错误消息。

一些事情用这种方式吸吮。首先,我必须确保客户端和服务器端的错误消息相同。所以我会一直有2个重复的消息。

所以,如果我拼错了一个词,我必须确保我记得在2个地方改变它。其次,很难返回服务器端的错误(我的网站大部分几乎都是ajax),所以我做的是我总是要检查一个标志。

$.post('Create',{'test',test},function(response) 
{ 
    if(response.IsValid == false) 
    { 
     // check other json parameters to get all error msgs 
     // add them to some div container and display to user. 
    } 
    else 
    { 
     // show success msg. 
    } 
}): 

我在查看数据注释,但我不确定他们是否会帮助我,因为我使用的是ajax帖子。

如果您点击一个连接到ajax文章的按钮,客户端代码是否仍然显示?

我也猜测服务器端的邮件永远不会显示的,因为它不依赖于寻找那些需要一个完整的页面呈现HTML验证辅助?

我也发现它们非常有限。我知道你可以编写你自己的,但似乎很多写(服务器端和客户端代码),特别是因为我将不得不写基本上jQuery验证提供的一切。

是否有更新的活动,允许您使用jquery.validate(包括远程,jquery.validate)数据注释的库吗?

最后我不知道这段代码应该放在哪里。这本书的作者让我感到困惑。

public class Appointment 
    { 
     [Required(ErrorMessage = "Please enter your name")] [StringLength(50)] 
     public string ClientName { get; set; } 

     [DataType(DataType.Date)] [Required(ErrorMessage = "Please choose a date")] 
     public DateTime AppointmentDate { get; set; } 
    } 

他在什么似乎是一个教职员模型基本验证。我明白这一点,但什么困惑我是那么一个服务类,他再次做基本的验证和业务验证。

namespace BookingsExample.Domain.Services 
{ 
    public class AppointmentService 
    { 
     public static void CreateAppointment(Appointment appt) 
     { 
      EnsureValidForCreation(appt); 
      // To do: Now save the appointment to a database or wherever 
     } 

     private static void EnsureValidForCreation(Appointment appt) 
     { 
      var errors = new RulesException<Appointment>(); 

      if (string.IsNullOrEmpty(appt.ClientName)) 
       errors.ErrorFor(x => x.ClientName, "Please specify a name"); 

      if (appt.AppointmentDate < DateTime.Now.Date) 
       errors.ErrorFor(x => x.AppointmentDate, "Can't book in the past"); 
      else if ((appt.AppointmentDate - DateTime.Now.Date).TotalDays > 7) 
       errors.ErrorFor(x => x.AppointmentDate, "Can't book more than a week in advance"); 

      if (appt.ClientName == "Steve" && appt.AppointmentDate.DayOfWeek == DayOfWeek.Saturday) 
       errors.ErrorForModel("Steve can't book on weekends"); 

      if (errors.Errors.Any()) 
       throw errors; 
     } 
    } 
} 

仅仅因为你的模型层强制 它自己的规则,并不意味着你使用ASP.NET MVC的内置 验证支持有 停止。我发现它有帮助 认为ASP.NET MVC的验证 机制作为有用的第一行 防御特别擅长 生成客户端验证 脚本几乎没有工作。它在适合 整齐地与所述视图模型图案 (即,具有简单视图特定 模型只存在于控制器和视图和 之间传输 数据不持有业务逻辑):每个视图 模型类可以使用数据注释 属性来配置客户端 验证。

但是,您的域层不应该 信任您的UI层强制执行 业务规则。真正的执法 代码必须进入使用 一些技术,就像你刚才 看到的一个领域。 *

  • 这是从亲asp.net的MVC 2.0框架书第12章

我能理解那种,他为什么会这样,他可以采取的服务层,并用它在不同的项目(即你有一些移动应用程序的网站,你需要使用相同的业务逻辑)。

但是它看起来有点多余,他是在两个地方写一些相同的消息,现在他已经在2个地方,以更新的消息。我也不确定他为什么不信任“UI”来进行验证,因为它正在服务器端进行测试,并且应该是安全的。

所以那会不会只是更好地拥有这一切在服务层呢?或者,在视图模型中保留简单的必需字段以进行验证会更好吗?

+0

的控制器级验证确实是多余的,(IMO)完全愚蠢的。 – Sapph 2011-01-11 01:20:50

回答

1

数据注解来验证服务器上的物体的最佳解决方案。您可以在代码后面/控制器,服务层或数据访问层验证它们。

不幸的是,没有一个现成的解决方案来整合数据注释和jquery.validate的,所以你必须在客户端脚本中使用一些自定义的验证代码。如果你想进行集中验证,那么你可以对一个验证服务(json)进行ajax调用,它将通过Data annotations验证服务器上的Appointment对象并返回一个json结果给客户端。响应可以是简单的布尔值,也可以是更复杂的对象,可用于构建UI显示。

+0

+1现在你可以提供一些网址或参考资料,让我们开始使用这种将“数据注解”与jQuery验证和AJAX集成的方法。 – 2012-01-18 17:11:26