验证和Asp.net Mvc 2.0的最佳实践?

时间:2011-01-11 00:59:20

标签: c# asp.net-mvc-2 jquery-validate

我一直在阅读pro 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 validate提供的所有内容。

是否存在更新活动的库,允许您使用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的验证   机制作为有用的第一线   特别擅长的防守   生成客户端验证   几乎没有工作的脚本。它适合   整齐地与视图模型模式   (即,具有简单的视图特定   仅存在转移的模型   控制器和视图之间的数据   不持有业务逻辑):每个视图   model类可以使用Data Annotations   用于配置客户端的属性   验证

     

但是,您的域名图层不应该   相信您的UI图层可以强制执行   商业规则。真正的执法   代码必须使用进入域   一些你喜欢的技术   刚见过*

  • 这是来自pro asp.net mvc 2.0框架书第12章。

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

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

那么在服务层中将它全部放在一起会不会更好?或者,最好在视图模型中保留简单的必填字段以进行验证?

1 个答案:

答案 0 :(得分:1)

数据注释是验证服务器上对象的最佳解决方案。您可以在/ controllers,服务层或数据访问层后面的代码中验证它们。

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