asp.net-mvc-3 - jquery $.post() 使用 Json() 返回 JSON

标签 asp.net-mvc-3 jquery jsonresult

我不知道我做错了什么 - 我确信这曾经有用......:

<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>

我有一个以字符串形式返回 View 结果的函数,这样我就可以将其作为 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();
  }
}

所以,在我的 Controller 中我有:

    [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 类型 application/json 进行传输。”它将 JSON 在浏览器中呈现为文本。 在 Firefox/IE 中,它提示我下载文件。

什么给出了?

最佳答案

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

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

关于asp.net-mvc-3 - jquery $.post() 使用 Json() 返回 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769854/

相关文章:

jquery - Chrome 使用动态内容折叠内联元素的宽度

c# - 如何使用 "dynamic"变量从匿名类型读取属性

asp.net-mvc-3 - 如何在 MVC3 操作方法中访问 c​​ookie?

javascript - 反序列化服务器 asp.net mvc 3 上的 javascript 日期

c# - 发布后重新加载当前 View

javascript - jQuery从左到右动画定位问题

asp.net-mvc - 使用 ASP.NET MVC3 进行客户端模型级或表单级验证

javascript - 如何使用 jQuery/Javascript 运行浏览器命令?

asp.net-mvc - 这是 jquery ajax 调用 aspnet mvc Controller 的有效数据吗?

c# - Nunit中测试JsonResult的Helper方法