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") должно сработать.

Другие вопросы по тегам