【问题标题】:Best Practices with Validation and Asp.net Mvc 2.0?验证和 Asp.net Mvc 2.0 的最佳实践?
【发布时间】:2011-01-11 00:59:20
【问题描述】:

我一直在阅读专业的 asp.net mvc 2.0 框架,我有点困惑我应该使用什么来进行验证,应该去哪里以及如何确保我不必继续编写相同的代码。

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

这种方式有几件事情很糟糕。首先,我必须确保客户端和服务器端的错误消息相同。所以我总会有 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; }
    } 

他对似乎是一个 veiw 模型的基本验证。我理解这一点,但让我感到困惑的是,他在服务类中再次进行了基本验证和业务验证。

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 层来执行 商业规则。真正的执法 代码必须使用 一些技术,比如你已经掌握的技术 刚看到。 *

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

我可以理解他这样做的原因,以便他可以在不同的项目中使用服务层(即您的网站有一些移动应用程序,您需要使用相同的业务逻辑)。

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

那么把它全部放在服务层不是更好吗?还是在视图模型中保留简单的必填字段以进行验证更好?

【问题讨论】:

  • 控制器级别的验证确实是多余的并且(imo)完全愚蠢。

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


【解决方案1】:

数据注释是在服务器上验证对象的最佳解决方案。您可以在代码隐藏/控制器、服务层或数据访问层中验证它们。

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

【讨论】:

  • +1 提醒一下,您还可以提供一些网址或参考资料,让我们开始使用这种方法将“数据注释”与 jQuery 验证和 AJAX 集成。
猜你喜欢
  • 2023-03-12
  • 2010-11-11
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多