【发布时间】:2010-12-25 08:04:56
【问题描述】:
这是我之前收到的关于将错误传递回客户端的previous question 的后续,但也与 ModelState 相关。
有没有人成功地使用了 Nerd Dinner 方法,但使用了 Ajax?因此,Nerd Dinner 进行了更新。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch
{
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
}
使用 jQuery $.ajax
function hijack(form, callback, errorFunction, format) {
$.ajax({
url: form.action,
type: form.method,
dataType: format,
data: $(form).serialize(),
success: callback,
error: function(xhr, textStatus, errorThrown) {
errorFunction(xhr, textStatus, errorThrown);
}
});
}
Ajax,控制器的“try”部分变成了
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return PartialView("PartialDetails", new { id=dinner.DinnerID });
}
,但是你如何处理 catch 部分?
发回错误的简单错误处理解决方案是
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
//throw ex;
}
,但它不会通过内置于 MVC 中的健壮模型状态。我想了很多选择,但我真的想要两件事:
- 我希望在 jQuery 的错误属性中处理错误。
- 我想尽可能使用内置的 ASP.Net MVC 验证逻辑。
这可能吗?如果不是,您知道的最佳替代方案是什么?
非常感谢。
更新 我还没有将此标记为已回答,因为我还没有实现我认为最有效的方法。
我已经决定我不太喜欢成功 => 发送刷新列表,失败 => 发送我正在采用的错误消息方法。我这样做是为了减少调用次数,但是页面上确实设置了一个刷新的列表。尝试两者都将弹出窗口紧密绑定到其整个页面。
我将添加一个自定义 jQuery 事件,在对话框关闭时刷新母版页列表。本质上,它是观察者模式。我喜欢页面对弹出窗口说“完成后告诉我”(又名关闭)的想法,而不必告诉弹出窗口原因。它确实需要额外的调用,但我不认为这是一个大问题。
我仍然不确定我喜欢/不喜欢服务器端验证的程度,我正在考虑仅使用客户端验证。虽然服务器端验证看起来像是干净的分层,但它也存在许多问题,包括:
1) 它将质量检查放在最后,而不是开始。与制造类似,汽车在到达经销商处进行测试,而不是在制造过程中的点进行测试。
2)它违反了Ajax的意图。 Ajax 不仅仅是发送异步事件,它也是只发送我需要的东西,只接收我需要的东西。发回整个模型状态以提供错误详细信息似乎不适用于 Ajax。
我正在考虑只进行客户端验证,但服务器代码和自定义视图模型可用于告诉客户端如何动态创建这些验证规则。
我还怀疑 IronRuby 或 IronPython 这样的动态语言可能会提供一种更优雅的方式来解决这些问题,但我可能需要更长的时间才能研究这种可能性。
【问题讨论】:
-
嗯,我认为这真的取决于场景,如果做 2 个请求不是问题,我会去做。个人在客户端使用 JavaScript 进行大量验证并不是我喜欢的事情(我不知道为什么,但我认为 js 不是很受信任/安全/同等实现的东西(在这个 jquery 中拯救了一天)),特别是因为有时你不能在客户端进行所有验证,你必须使用某种服务器端检查,比如(这个实体已经存在于数据库中?),并且支持禁用 js 的客户端,但正如我在开始时所说的那样视情况而定。
-
我同意您不能在客户端进行所有验证,看起来验证框架似乎主要针对字段错误(太长,不是日期等)。至少在我见过的例子中。当您检查用户输入时,Javascript 似乎是进行检查的合适位置。
-
我已经下定决心要进行 2 次调用而不是 1 次调用,因为它将详细信息部分视图与其下方的页面视图分离。我希望弹出窗口回复页面视图“我已关闭”,但不知道页面视图将要做什么。 jQuery 应该毫不费力地做到这一点。这使我不必担心对我的详细信息部分视图的更改会影响页面,反之亦然。
标签: jquery asp.net-mvc error-handling