2

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

<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 中,它提示我下载文件。

是什么赋予了?

4

1 回答 1

2

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

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

于 2011-10-14T15:38:34.153 回答