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 タイプ application/json で転送されました。」JSON をブラウザでテキストとしてレンダリングします。Firefox/IE では、ファイルをダウンロードするように求められます。

何を与える?

4

1 に答える 1

2

フォームの送信が抑制されていません。取得しているメッセージは、JSON を返すページへの実際のフォーム送信からのものです。ブラウザのアドレス バーを確認すると、URL が異なっていることがわかります。

コンソールで実行する$("#@containerId form")と、結果が得られないことがわかるはずです。「@」はセレクターでは無効な文字であり、エスケープする必要があります。 $("#\\@containerId form")動作するはずです。

于 2011-10-14T15:38:34.153 に答える