私は自分が間違っていることを理解できません-これは以前は機能していたと確信しています...:
<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 タイプ application/json で転送されました。」JSON をブラウザでテキストとしてレンダリングします。Firefox/IE では、ファイルをダウンロードするように求められます。
何を与える?