gpt4 book ai didi

jquery - 在 ASP.Net MVC 中,ModelState 可以与 ajax 更新一起使用吗?

转载 作者:行者123 更新时间:2023-12-03 22:18:45 28 4
gpt4 key购买 nike

这是 previous question 的后续内容我之前有过关于将错误传递回客户端的内容,但也与 ModelState 有关。

有没有人成功地使用了 Nerd 晚餐方法,但是使用了 Ajax?因此 Nerddinner 也进行了更新。

[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, Controller 的“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 中内置的强大模型状态。我想到了很多选择,但我真正想要两件事:

  1. 我希望在 jQuery 的错误属性中处理错误。
  2. 我想尽可能使用内置的 ASP.Net MVC 验证逻辑。

这可能吗?如果没有,您知道什么是最好的替代方案?

非常感谢。

更新我还没有将其标记为已回答,因为我还没有实现我认为最有效的方法。

我决定我不太喜欢我所采用的成功 => 发送刷新列表,失败 => 发送错误消息的方法。我这样做是为了减少调用次数,但实际上正在将刷新的列表设置到页面。尝试同时执行这两项操作会将弹出窗口紧密绑定(bind)到其整个页面。

我将添加一个自定义 jQuery 事件,当对话框关闭时刷新母版页列表。本质上,它是观察者模式。我喜欢页面对弹出窗口说“完成后告诉我”(又称关闭),而不必告诉弹出窗口原因。它确实需要额外的调用,但我不认为这是一个大问题。

我仍然不确定我是否喜欢/不喜欢服务器端验证,并且我正在考虑仅进行客户端验证。虽然服务器端验证看起来像是干净的分层,但它也存在许多问题,包括:

1) 它将质量检查放在最后,而不是开始。与制造的类比是一辆汽车在到达经销商时进行测试,而不是在制造过程中进行测试。
2)违背了Ajax的意图。 Ajax 不仅仅是发送异步事件,它还可以只发送我需要的内容并只接收我需要的内容。发回整个模型状态以提供错误详细信息似乎并不适合 Ajax。

我正在考虑做的是仅进行客户端验证,但服务器代码和自定义 View 模型可用于告诉客户端如何动态创建这些验证规则。

我还怀疑像 IronRuby 或 IronPython 这样的动态语言可能会提供一种更优雅的方法来解决这些问题,但我可能需要更长的时间才能研究这种可能性。

最佳答案

如果我明白您想要做什么,我的第一个答案将是“否”,您不能使用模型状态,因为它是通过 Ajax 请求来使用的。

您也许可以模拟 ModelState行为,显示错误:

  1. 传递 List<KeyValuePair<string,string>> (属性,消息)通过 JSON (这将要求您将 modelErrors 从 ModelState 传递到新结构)并通过 JS/jQuery 进行验证摘要的 HTML 构造(我认为这是过度的解决方案)。

  2. 如果您要访问服务器,并且出现任何错误,只需渲染 Html.ValidationSummary() 的部分内容即可。 ,通过 JSON 传递它,并将其添加到表单前面。如果一切正常,只需返回 PartialDetails查看并替换实际内容。这将需要某种状态参数,以便您知道 ajax 回调中服务器返回的内容。

编辑:最后一个选项听起来不错但很棘手,因为您需要通过JSONResult以字符串形式返回部分 View 。 。以下是有关该黑客攻击的问题和解决方案:How to render an ASP.NET MVC view as a string? .

就我个人而言,我认为使用 error 属性根本没有任何好处。我只是在非常特定的情况下使用它,例如超时错误和服务器异常,而不是应用程序异常。

编辑:

使用 JSON:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return Json(new
{
result = "success",
html = this.RenderToString("PartialDetails", dinner)
});

}
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return Json(new
{
result = "failed",
html = this.RenderToString("PartialEdit", dinner)
});
}
}

这里是result参数会让您知道在每种情况下要执行什么操作,只需在回调中检查它即可。

关于jquery - 在 ASP.Net MVC 中,ModelState 可以与 ajax 更新一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com