JSON вернулся с использованием Json() с помощью jquery $.post()
Я не могу понять, что я делаю неправильно - я уверен, что раньше это работало...:
<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 мне предлагается загрузить файл.
Что дает?
1 ответ
Форма не подавляется. Сообщения, которые вы получаете, поступают от фактической отправки формы на страницу, которая возвращает JSON. Если вы проверите адресную строку браузера, вы должны увидеть, что URL-адрес отличается.
Если вы бежите $("#@containerId form")
в консоли вы должны увидеть, что вы не получаете результатов. "@" является недопустимым символом в селекторе и должен быть экранирован. $("#\\@containerId form")
должно сработать.