【问题标题】:Ajax.BeginForm add ModelSstate error sent from controller?Ajax.BeginForm 添加从控制器发送的 ModelSstate 错误?
【发布时间】:2014-03-25 14:35:44
【问题描述】:

我的视图中有一个 ajax 表单

@using (Ajax.BeginForm("AttendeeAvailability", "Response", new AjaxOptions { HttpMethod = "POST", OnSuccess = "done" }))
{
    @Html.ValidationSummary(true)
    ....
    //some stuff
    ....
}
<script type="text/javascript">

    function done() {
     //do something;
    }
</script>

这里是控制器的post方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AttendeeAvailability(AttendeeAvailableDateTime response)
{            
    ....
    ....
    if (somecheck1)
    {
        ModelState.AddModelError(string.Empty,"Check error1");
        return View();
    }
    if (doesTimeExists2)
    {
        ModelState.AddModelError(string.Empty,"Check error2");
        return View();
    }
    //do some database actions
    return View();
}

目前我没有收到任何在控制器中设置的 Modelstate 错误消息。

我猜是因为当控制器中的任务成功完成时,它会调用我看到的 done 函数。

在这种情况下,我如何发送一些错误并将它们显示为 Modelstate 错误?

【问题讨论】:

  • 一个 AJAX 请求(也意味着提交)返回浏览器可能用来更新部分文档的数据(它可以刷新整个文档,但这是完全不同的故事)。您的页面没有完全刷新。这意味着您无权访问ModelState。我的意思是,你有,但它是原始的,用于“干净”页面。如果您将Ajax.BeginForm 更改为“常规”表单,您的网页将完全刷新,您将获得ModelState
  • 那么我怎样才能发送一些错误信息并显示它们呢?有什么办法吗?
  • 您可以发回一个 Json 对象/字符串,并且进程在 done() 函数中。
  • 您能否指导我了解我的完成功能如何作为答案。我对此没有太多经验

标签: jquery ajax asp.net-mvc asp.net-ajax


【解决方案1】:

更改表单调用头(在done函数中添加参数):

@using (Ajax.BeginForm("AttendeeAvailability", "Response", 
     new AjaxOptions { HttpMethod = "POST", OnSuccess = "done(data)" }))

...和 ​​JavaScript:

<script type="text/javascript">
    function done(data) {
    //do something with the data
    }
</script>

data 的外观完全取决于您在操作中的结构:

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult AttendeeAvailability(AttendeeAvailableDateTime response)
{            
   ....
   ....
   if (somecheck1)
   {
        //ModelState.AddModelError(string.Empty,"Check error1");
        return Json(new { error = "Check error1" }, JsonRequestBehavior.AllowGet);
   }
   if (doesTimeExists2)
   {
       //ModelState.AddModelError(string.Empty,"Check error2");
       return Json(new { error = "Check error2" }, JsonRequestBehavior.AllowGet);
   }

   //do some database actions
   return Json(new { success = "Success" }, JsonRequestBehavior.AllowGet);
}

按照这个,你可以通过解析来访问数据:

<script type="text/javascript">
    function done(data) {
        var confirmation = data;
        if (confirmation["success"] != undefined) {
           alert(confirmation["success"]);
        }
        else if (confirmation["error"] != undefined) {
           alert(confirmation["error"]);
        }
    }
</script>

【讨论】:

  • 哈哈我的意思是我将如何显示消息,因为 ModelStateError 通常显示。这是//do something with the data,但是是nvm。可能是我没有正确解释自己
  • 基本上每个AJAX请求都会从服务器接收一些数据。您可以使用此数据来更新元素 (UpdateTargetId) 或传递您想要或需要的任何自定义数据/消息。
  • 所以我可以在表单中有一个 div 并使用从控制器传递的消息从 javascript 函数更新该 div 内容吗?
  • 没错。一旦你从服务器取回数据,你就可以对它做任何你想做的事情。
  • 在您的return Json(new { error = "Check error2", JsonRequestBehavior.AllowGet); 中您是否缺少} 我一直在尝试放在不同的地方,但可能是因为我放错了地方,我在浏览器中遇到控制台错误跨度>
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多