4

HTMLのスクリプトタグ内にいくつかのjsonをレンダリングするために別のビューを呼び出すビューがあります:

public ActionResult App()
{
  return View();
}

public JsonResult SomeJsonData()
{
  // ... here goes the code that generates the model
  return Json(model, JsonRequestBehavior.AllowGet);
}

私の App.cshtml ファイル内には、次のようなものがあります。

<script type='text/javascript'>
  var myJsonData = @Html.Action("SomeJsonData", "MyController");
</script>

問題は、ブラウザーでページをリロードすると (現在 Chrome 20 を使用)、すべてのマークアップが表示されることがあり、開発者ツールの [ネットワーク] タブに移動すると、ページのコンテンツ タイプが要求されていることがわかります。タイプは「application/json」でした。ページをリロードするだけで、正しく読み込まれます (コンテンツ タイプは「text/html」である必要があります)。

なぜこれが起こるのかについて何か考えはありますか?または私は何を間違っていますか?

4

4 に答える 4

2

a を返すとJsonResult、応答の Content-Type が に変更されapplication/jsonます。したがって、最初Appにビューを返すコントローラー アクションを呼び出し、明らかに Content-Type を に設定し、返されたビュー内で、前のコンテンツ タイプをクラップしてそれを に変更するアクションをtext/html呼び出します。もちろん、最後のものが勝ち、それが一日の終わりにユーザーエージェントが見るものです: .SomeJsonDataapplication/jsonapplication/json

したがって、次のように進めます。

public ActionResult App()
{
    // ... here goes the code that generates the model
    var model = ...

    return View(model);
}

そして、強く型付けされたビューで:

@model MyViewModel
<script type="text/javascript">
    var myJsonData = @Html.Raw(Json.Encode(Model));
</script>
于 2012-07-10T19:10:05.520 に答える
1

実際、別の関連する質問を見つけました

JsonResult に対して @Html.Action を呼び出すと、親テンプレートの応答タイプが変更されます

投稿する前に何も見つかりませんでした。

私がとろうとしているアプローチは、json データを返すときにコンテンツ タイプを変更することです。

public JsonResult SomeJsonData(bool returnAsHtml = false)
{
  // ... here goes the code that generates the model
  return returnAsHtml ?Json(model, "text/html", JsonRequestBehavior.AllowGet) : Json(model, JsonRequestBehavior.AllowGet);
}

および App.cshtml で

<script type='text/javascript'>
  var myJsonData = @Html.Action("SomeJsonData", "MyController", new {returnAsHtml = true});
</script>

また、アプリケーション/json の応答を期待している他の場所から actionmethod を呼び出すことを許可するフラグも追加しています。

于 2012-07-10T19:22:29.160 に答える
0

他の人が言ったように、JSON を返すアクションは、応答のコンテンツ タイプを変更しています。

HtmlHelper を使用して JSON をページに配置することで、これを回避できました。コントローラーとアクションの使用を避けています。私の HtmlHelper は静的メソッドを呼び出しています。このソリューションはおそらくすべての場合に機能するとは限らず、ハックのようなものですが、この方法でデータを一連のビュー モデルに入れる必要がなくなります。

namespace System.Web.Mvc.Html
{
   public static class JsonDataProviderHelper
   {
      public static MvcHtmlString JsonDataProvider(this HtmlHelper helper, JsonDataType jsonDataType)
      {
         switch (jsonDataType)
         {
            case JsonDataType.YARDSALE_MINI_CALENDAR:
               var yardsales = SalesEventCrud.GetByMonthForJavascript(null, MvcApplication.CurrentPortalId);
               return new MvcHtmlString(JsonConvert.SerializeObject(SalesEventCrud.GetByMonthForJavascript(null, MvcApplication.CurrentPortalId)));

            default:
               return new MvcHtmlString("");
         }
      }

      public enum JsonDataType
      {
         YARDSALE_MINI_CALENDAR
      }
   }
}

シリアル化に json.net を使用しています。このヘルパーを使用して、他の状況でも JSON を返すことを計画しているため、switchステートメントがあります。

そしてページで:

<script type="text/javascript">
   jQuery(document).ready(function () {
      setupSmallSidebarCalendar(@Html.JsonDataProvider(JsonDataProviderHelper.JsonDataType.YARDSALE_MINI_CALENDAR));
   });
</script>

このページでは、データはそのままの JSON で書き込まれるため、他のデータの解析やマッサージは必要ありません。

于 2013-04-27T20:10:43.947 に答える