【问题标题】:JSON returned using Json() by jquery $.post()jquery $.post() 使用 Json() 返回的 JSON
【发布时间】:2011-10-14 15:24:11
【问题描述】:

我无法弄清楚我做错了什么 - 我确信这曾经有效...:

<script type="text/javascript">
  $("#@containerId form").submit(function (event) {
    event.preventDefault();
    var form = $(this);
    if (form.valid()) {
      $.post(form.attr('action'), form.serialize(), function(data) {
        $("#@containerId").replaceWith(data.result);
      }, "json");
    }
  });      
</script>

我有一个函数将视图结果作为字符串返回,因此我可以将它作为 JSON 响应中的对象返回:

protected string RenderViewResultToString(ViewResultBase viewResult) {
  using (var sw = new StringWriter()) {
    if (string.IsNullOrEmpty(viewResult.ViewName))
      viewResult.ViewName = ControllerContext.RouteData.GetRequiredString("action");
    ViewEngineResult result = null;
    if (viewResult.View == null) {
      result = viewResult.ViewEngineCollection.FindPartialView(ControllerContext, viewResult.ViewName);
      if (result.View == null)
        throw new InvalidOperationException("Unable to find view. Searched in: " + string.Join(",", result.SearchedLocations));
      viewResult.View = result.View;
    }
    var view = viewResult.View;
    var viewContext = new ViewContext(ControllerContext, view, viewResult.ViewData, viewResult.TempData, sw);
    view.Render(viewContext, sw);
    if (result != null)
      result.ViewEngine.ReleaseView(ControllerContext, view);
    return sw.ToString();
  }
}

所以,在我的控制器中,我有:

    [HttpPost, ValidateInput(false)]
    public JsonResult Edit(/* stuff */) {
        bool success = true;
        try {
            /* stuff */         
        } catch {
            /* stuff */
            success = false;
        }
        return Json(new { success, result = RenderViewResultToString(/* stuff - call to something that gives a ViewResult */) });
    }

在 Chrome 中,我得到:“资源解释为文档,但使用 MIME 类型应用程序/json 传输。”并将浏览器中的 JSON 呈现为文本。 在 Firefox/IE 中,它提示我下载文件。

什么给了?

【问题讨论】:

    标签: asp.net-mvc-3 jquery jsonresult


    【解决方案1】:

    表单提交没有被禁止。您收到的消息来自实际的表单提交到返回 JSON 的页面。如果您检查浏览器地址栏,您应该会看到 URL 不同。

    如果您在控制台中运行$("#@containerId form"),您应该会看到您没有得到任何结果。 “@”是选择器中的无效字符,需要转义。 $("#\\@containerId form") 应该可以工作。

    【讨论】:

    • 是的,地址确实发生了变化。 @ 是 razor 语法,它输出一个有效的 id,所以这不是问题。
    • 我以为event.preventDefault(); 应该禁止提交表单?
    • 您确定您的提交方法被调用了吗?尝试在开头添加警报。如果不是,请在控制台中打开它并查看实际的选择器是否返回结果。如果是,请尝试return false; 而不是event.preventDefault(); 提交功能真的很旧,这应该可以工作。
    • 啊,虽然 containerId 在我的情况下应该是 windowId - 我使用的是 Telerik 窗口,它是在页面上的单独位置创建的 - 真是个傻瓜!感谢您提供控制台提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2013-08-27
    • 2013-12-20
    相关资源
    最近更新 更多