8

假设我有一个包含表单的弹出窗口。我必须有一个处理表单的控制器,根据结果,这个控制器返回 JSON(如果一切顺利,并且弹出窗口可以通过 javascript 关闭)或 HTML(如果表单数据无效并且必须替换表单)带有新的 html - 带有验证错误消息)。所以我找到了这样一个解决方案:那就是形式:

<form id="message" ...>
    ...
</form>

我有这个表单的 jquery 处理程序:

$(document).on("submit", "form#message", function (evt) {
    evt.preventDefault();
    $.ajax({
        type: this.method,
        url: this.action,
        data: $(this).serialize(),
        success: function (result) {
            if ($.isPlainObject(result)) {
                // this is JSON
                // close the pop-up window
            } else {
                // this is HTML
                $("form#message").html(result);
            }
        }
    });
});

控制器:

[HttpPost]
public ActionResult UpdateMessage(MessageModel model)
{
    ...
    if (.. is valided ..)
        return Json(new { success = "OK" });
    else
        return View(model);
}

问题 - 对于此类任务是否有更优雅的解决方案?

4

3 回答 3

5

恕我直言,这是一个非常好的解决这个问题的方法,而且我肯定会使用它。

于 2013-05-21T06:21:17.533 回答
2

用你的方法看起来不错。但是,如果您的 JSON 错误消息对于所有屏幕都是通用的,我建议您可以在这种情况下编写一个操作过滤器。所以我们可以让代码更优雅

[HttpPost]
[JsonErrorHandling]
public ActionResult UpdateMessage(MessageModel model)
{    
    return View(model);
}

public class JsonErrorHandlingAttribute : ActionFilterAttribute, IActionFilter 
{
   void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
   {
      // TODO: doing some thing magic here
      // if (.. is valided ..)
      //  return Json(new { success = "OK" });

      this.OnActionExecuting(filterContext);
   }
}
于 2013-05-21T07:13:11.437 回答
0

如果您需要从 URL 返回多个数据类型,则无需在 jQuery AJAX 调用中传递数据类型。`

  $.ajax({
    type: "GET",
    url: url,
    data: data,
    //dataType: "json",  comment this line
    cache: false,
    beforeSend: function () {},
    success: function (data) {},
    error: function (xhr, ajaxOptions, errorThrown) {}
  });
于 2016-12-22T18:47:14.630 回答