11

I've got the following controller:

public class HelloController
{
    public ActionResult Index()
    {
        return View()
    }

    public ActionResult Hello()
    {
        return Json(new{ greeting = "hello, world!" }, JsonRequestBehavior.AllowGet);
    }
}

Then, inside Index.cshtml:

...html stuffs
<script type="text/javascript">
    alert("@Html.Action("Hello")");
</script>

What I'm finding is that, when going to this url in my browser, the response content type is application/json; charset=utf-8 which causes the browser to render the html as a string instead of as... a web page.

What's the best way to get around this?

4

3 に答える 3

5

これは、すべてのHtml.Action呼び出しが直接実行されるためです。何かのようなもの:

  1. インデックスは呼ばれます
  2. 結果の表示が実行されます
  3. こんにちはアクションが実行され、のContextTypeを設定します
  4. インデックスビューの結果が返されます
  5. ブラウザにページが表示されます

2つのオプションがあります。

  1. 「Helloworld!」を生成するロジックを破ります。通常のC#クラスに追加し、インデックスコントローラーアクションで直接呼び出します
  2. ajaxを介してHelloアクションをロードし、を表示しalertます。

オプション1

public class HelloController
{
    YourBusiness _yb;

    public HelloController(YourBusiness yb)
    {
        _yb = yb;
    } 
    public ActionResult Index()
    {
        return View(yb.GenerateHello())
    }

    // used for everything but Index
    public ActionResult Hello()
    {
        return Json(new{ greeting = yb.GenerateHello() }, JsonRequestBehavior.AllowGet);
    }
}

public class YourBusiness
{
    public string GenerateHello()
    {
        return "Hello wolrd!";
    }
}

オプション2

<script type="text/javascript">
    $.get('@Url.Action("Hello")', function(response) {
        alert(response.greeting);
    }
</script>

サイドノート

Internet Explorerは、キャッシュに関しては非常に積極的です。JSON応答が変更されます。したがって、JSONアクションにキャッシュを指定しないこともお勧めします。

[OutputCache(Duration = 0, NoStore = true)]
public ActionResult Hello()
{
    return Json(new{ greeting = "hello, world!" }, JsonRequestBehavior.AllowGet);
}
于 2012-05-11T05:13:33.590 に答える
0

Json() メソッドを呼び出して JsonResult を返す場合、Web ページは返されません。ページを返すには、View メソッドを呼び出して ViewResult を返す必要があります。メソッドには対応するビュー テンプレートが必要です

このリンクまたはこのリンクをチェックしてください

于 2012-05-11T01:38:21.260 に答える