我不知道我做错了什么 - 我确信这曾经有用......:
<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/