【发布时间】: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