控制器可以根据结果返回JSON或HTML

时间:2013-05-21 06:18:54

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

假设我有一个包含表单的弹出窗口。我必须有一个处理表单的控制器,并且根据结果,该控制器返回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);
}

问题 - 这些任务有更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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);
   }
}

答案 2 :(得分:0)

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

  $.ajax({
    type: "GET",
    url: url,
    data: data,
    //dataType: "json",  comment this line
    cache: false,
    beforeSend: function () {},
    success: function (data) {},
    error: function (xhr, ajaxOptions, errorThrown) {}
  });