【问题标题】:How can I pass JavaScript errors from an action to my view?如何将 JavaScript 错误从操作传递到我的视图?
【发布时间】:2010-11-06 16:42:13
【问题描述】:
我有 2 个操作,一个用于 GET,另一个用于处理 POST 请求。
虽然我在客户端进行了验证,但我也在服务器端检查了一些内容(在我的操作方法中)。
在 POST 操作中,当我发现要向 UI 报告的错误等时,我必须通过哪些选项将消息/错误发送回客户端?
注意:
我正在使用流行的 jQuery 验证插件 als。
【问题讨论】:
标签:
c#
javascript
jquery
asp.net-mvc
error-handling
【解决方案1】:
在 Web 应用程序/网站中实现验证时遵循的一些规则:
- 验证应在客户端和服务器端进行
- 对于关闭脚本的用户,服务器端验证应反映客户端验证
- 尽管验证规则在两个地方强制执行,但逻辑不应重复
按照这些规则,我使用以下解决方案:
令人惊讶的是,它的易用性和效果如何。它透明地使用 JQuery 验证插件,并且只用最少的编码完成它应该做的事情。
您认为客户端验证包括:
<%= Html.ClientSideValidation<Foo>() %>
您操作中的服务器端验证包括
ModelState.IsValid
【解决方案2】:
我正在使用从视图到发布操作的模型绑定,它具有可用于此的内置验证。
然而,有些人更喜欢在模型之外进行验证。要将这些错误返回给 View,您需要更新 ModelState,然后正常检查它是否有效(包含错误):
public Dictionary<string, string> ValidateEntry(Object obj)
{
var errors = new Dictionary<string, string>();
if (string.IsNullOrEmpty(obj.Owner))
{
errors.Add("Owner", "You must select Owned By.");
}
//... whatever else
return errors;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Object cap)
{
var errors = ValidateEntry(cap);
if (errors.Count > 0)
{
foreach (var err in errors)
{
ModelState.AddModelError(err.Key, err.Value);
}
}
if (ModelState.IsValid)
{
//... do if valid
}
return View(ViewModel);
}