【问题标题】:Controller can return either JSON or HTML depending on the result控制器可以根据结果返回 JSON 或 HTML
【发布时间】:2013-05-21 06:18:53
【问题描述】:

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

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

【问题讨论】:

  • 为清楚起见,为什么不只在 json 键中返回 html 并简单地检查是否设置了错误键?
  • @fliespl,将 ASP.NET MVC 视图呈现为服务器上的字符串并将这些部分序列化为 JSON 有点像 PITA。
  • 真的吗?如果我没记错的话,你可以只用几行简单地渲染部分 - 可能与你的代码中的数字相同:)
  • @fliespl,是的,有一些黑客可以做到这一点,但我总是找到它们,嗯,hacks
  • @DarinDimitrov 我不是 ASP.NET 专家 - 我只记得在这种情况下重新渲染部分 - 很高兴知道这些被视为 hack。

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


【解决方案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);
   }
}

【讨论】:

  • 就我而言,如果一切正常,控制器将返回 JSON。错误返回到 HTML。并且“TODO”必须在客户端执行 - 在 java 脚本中。但是感谢您的回答-在另一个地方对我有用;)
【解决方案3】:

如果您需要从 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) {}
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2015-12-10
    • 2010-09-18
    相关资源
    最近更新 更多