严重的n00b警告在这里;请怜悯!ASP.NET MVC:如何使用Html.ValidationSummary向最终用户解释无效类型违规?
因此,我完成了Nerd Dinner MVC Tutorial,现在我正在使用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做的事情完全相反。
我需要一个新的验证模式或者是有一些方法,以原来的形式值传递给处理我的模型类?
CustomerController代码
// 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);
}
哇感谢详细的答复!这需要我花一段时间来解析,但我一定会在沉浸于自己之后再回来看看。谢谢! – 2010-04-21 23:57:37
您的帖子是一个巨大的帮助!感谢您指点我正确的方向! – 2010-04-24 01:49:00
很乐意提供帮助:-) – Charlino 2010-04-24 01:51:06