这里有严重的 n00b 警告;请怜悯!
所以我完成了Nerd Dinner MVC 教程,现在我正在使用 Nerd Dinner 程序作为一种粗略的模板,将 VB.NET 应用程序转换为 ASP.NET MVC。
我正在使用“IsValid / GetRuleViolations()”模式来识别无效的用户输入或违反业务规则的值。我正在使用 LINQ to SQL 并利用“OnValidate()”钩子,它允许我在尝试通过 CustomerRepository 类保存对数据库的更改时运行验证并引发应用程序异常。
无论如何,一切正常,除了当表单值到达我的验证方法时,无效类型已经转换为默认值或现有值。(我有一个整数的“StreetNumber”属性,尽管我认为这对于 DateTime 或任何其他非字符串也是一个问题。)
现在,我猜测 UpdateModel() 方法会引发异常,然后更改值,因为 Html.ValidationMessage 显示在 StreetNumber 字段旁边,但我的验证方法从未看到原始输入。这有两个问题:
虽然 Html.ValidationMessage 确实表明有问题,但 Html.ValidationSummary 中没有相应的条目。如果我什至可以让异常消息显示在那里,表明无效的演员阵容或总比没有好。
我的客户部分类中的验证方法永远不会看到原始用户输入,所以我不知道问题是缺少条目还是无效类型。我不知道如何在一个地方保持我的验证逻辑整洁,并且仍然可以访问表单值。
我当然可以在处理用户输入的视图中编写一些逻辑,但这似乎与我应该使用 MVC 做的完全相反。
我需要一个新的验证模式还是有什么方法可以将原始表单值传递给我的模型类进行处理?
客户控制器代码
// POST: /Customers/Edit/[id]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Customer customer = customerRepository.GetCustomer(id);
try
{
UpdateModel(customer);
customerRepository.Save();
return RedirectToAction("Details", new { id = customer.AccountID });
}
catch
{
foreach (var issue in customer.GetRuleViolations())
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(customer);
}