Вопрос по content-type, asp.net-mvc, jsonresult – Вызов @ Html.Action for JsonResult меняет мой тип ответа в родительском шаблоне.

10

У меня есть следующий контроллер:

<code>public class HelloController
{
    public ActionResult Index()
    {
        return View()
    }

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

Тогда внутриIndex.cshtml:

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

Я обнаружил, что при переходе по этому URL в моем браузере тип содержимого ответаapplication/json; charset=utf-8 что заставляет браузер отображать HTML как строку, а не как ... веб-страницу.

Какой лучший способ обойти это?

Ваш Ответ

3   ответа
0

он не вернет веб-страницу. Чтобы вернуть страницу, вам нужно вернуть ViewResult, вызвав метод View. Ваш метод должен иметь соответствующий шаблон представления

Проверять, выписыватьсяэтот ссылка илиэтот один

7

Json(...) установить правильный тип контента.

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

    public ActionResult Hello()
    {
        return Json(new{ greeting = "hello, world!" }, "text/html", JsonRequestBehavior.AllowGet);
    }
}
Я предпочел бы сохранить тип контента как application / json, чтобы URL можно было использовать в целях, отличных от данного конкретного случая использования. DMac the Destroyer
4

Html.Action вызовы выполняются напрямую. Что-то вроде:

Index is called View result is executed Hello action is executed, set's ContextType Index view result is returned Browser displays the page

У вас есть два варианта:

Break out the logic which generates "Hello world!" into a regular C# class and invoke it directly in the Index controller action Load the Hello action through ajax and then display the alert. Option 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!";
    }
}
Option 2
<script type="text/javascript">
    $.get('@Url.Action("Hello")', function(response) {
        alert(response.greeting);
    }
</script>
Side note

Internet Explorer довольно агрессивен, когда дело доходит до кеширования. Ответы JSON будут изменены. Поэтому я рекомендую вам также не указывать кэш для действия JSON:

[OutputCache(Duration = 0, NoStore = true)]
public ActionResult Hello()
{
    return Json(new{ greeting = "hello, world!" }, JsonRequestBehavior.AllowGet);
}
В настоящее время я использую вариант 2, но думаю, что я переключу его на что-то более похожее на ваш первый вариант, чтобы уменьшить количество http-запросов. Спасибо! DMac the Destroyer

Похожие вопросы