14

Html.RenderAction子アクションのタイプが親アクションのタイプと異なる場合、Asp.Net MVC2 アプリを呼び出すと、ページの MIME タイプが変更される可能性があるようです。

以下のコード (MVC2 RTM でのテスト) は、私には理にかなっているように見えますが、 をapplication/json呼び出したときに type の結果を返しHome/Indexます。ページを表示する代わりに、ブラウザーはバーフを表示し、ダウンロードするかどうかを尋ねます。

私の質問: 何か不足していますか? これはバグですか?もしそうなら、最善の回避策は何ですか?

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData[ "Message" ] = "Welcome to ASP.NET MVC!";

        return View();
    }

    [ChildActionOnly]
    public JsonResult States()
    {
        string[] states = new[] { "AK", "AL", "AR", "AZ", };

        return Json(states, JsonRequestBehavior.AllowGet);
    }
}

見る:

<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<script>
  var states = <% Html.RenderAction("States"); %>;
</script>
4

6 に答える 6

9

これはバグだと思います。これがレンダリングされている子アクションである場合、アクションの応答が変更されるのはなぜですか? Html.Action でも同じことが起こり、文字列にレンダリングされます。私の回避策は次のとおりです。

Html.ViewContext.HttpContext.Response.ContentType = "text/html";

Html.Action を呼び出した後。誰かが次のようなラッパー Html Helper 拡張機能を作成できると思います。

var aux = Html.ViewContext.HttpContext.Response.ContentType;
Html.Action(....); // or Html.RenderAction(...)
Html.ViewContext.HttpContext.Response.ContentType = aux;
于 2010-11-16T19:19:16.060 に答える
8

バグではありません。タイプは、JsonResult結果を JSON に設定することになっています。通常は、それが必要なためです。

ここでは JSON の結果は必要ありません。JSON stringが必要です。では、なぜそれを書かないのですか?

[NonAction]
public string States()
{
    string[] states = new[] { "AK", "AL", "AR", "AZ", };

    return new JavaScriptSerializer().Serialize(states);
}
于 2010-03-15T15:47:00.833 に答える
4

何かが欠けているわけではありません (私もそうでない限り)。これはバグだと思います。ASP.NET MVC3 でも同じ問題があります。

シンプルなコンテンツ管理システムからコンテンツを返すコントローラー アクションがあります。CMS では、返される内容のコンテンツ タイプをユーザーが定義できます (たとえば、text/plain または text/xml)。

コントローラー アクションは、直接呼び出されるか、子アクションとして呼び出されて、ビューにコンテンツ管理要素を含めることができます。

コンテンツの一部が「text/plain」のコンテンツ タイプで作成され、これが ASP.NET MVC ビューに埋め込まれている場合、親のコンテンツ タイプがオーバーライドされ、ブラウザーに HTML が表示されます。

ゲイブ、親をオーバーライドする子アクションが望ましい結果であるシナリオがないように見えるという点で、あなたは頭に釘を打ったと思います。

私の解決策は、分岐しControllerContext.IsChildActionて独自の戻りオブジェクトを構築することですが、私の意見では、これはフレームワークによって処理されるべきものです。

あなたはこれを認識していると確信していますが、あなたの場合JsonResult.ContentType、親のコンテンツ タイプに明示的に設定することをお勧めします。

于 2011-10-14T15:41:08.327 に答える
3

これは、MIME タイプ「戻る」を明示的に強制することで解決できますtext/html

return Json(states, "text/html", JsonRequestBehavior.AllowGet);

ただし、これは必要ではないようです。

于 2010-03-15T15:47:54.897 に答える
1

Craig Stuntz が言ったように、コンテンツ タイプは変更されるはずです。

より良いアプローチは、AJAX でそのアクションを呼び出し、返されたオブジェクトをstatesJavaScript コードの変数に割り当てることです。

于 2010-03-15T16:00:52.547 に答える