Визуализация JsonResult в строку в Razor

У меня есть объект, сгенерированный сервером, который мне нужно преобразовать в объект JSON для использования JavaScript. Я предпочитаю визуализировать этот объект JSON непосредственно в переменную JS, когда представление отображается для предотвращения дополнительного HTTP-запроса.

Это в моем контроллере:

public virtual JsonResult GetTheThings()
{
    return Json(new
    {
        foo = "hello world",
        bar = 3,
    }, JsonRequestBehavior.AllowGet);
}

Я могу получить доступ к этому непосредственно на http://localhost:32243/MyController/GetTheThings и я получаю следующее отображается в моем браузере.{"foo":"hello world", "bar":3}, Отлично!

Итак, теперь я просто хочу отобразить результат этого представления в строку. Как мне это сделать? То, что я имею ниже, не работает, но, надеюсь, это даст вам идею.

Это моя попытка

<script>
  var myObj = @Html.RenderPartial(MVC.MyController.GetTheThings());
</script>

Обратите внимание, что я также использую шаблоны T4.

В конце концов, это то, что я хочу визуализировать в представлении.

<script>
  var myObj = {"foo":"hello world", "bar":3};
</script>

5 ответов

Поскольку вы хотите, чтобы объект отображался только при отображении представления (а не из вызова AJAX), лучше всего сделать его частью вашей модели. Создайте строковое свойство и сохраните JSON как строку, затем используйте JSON.parse в вашем представлении, чтобы преобразовать его в объект.

Пример:

<script>
    var myObj = JSON.parse("@Html.Raw(Model.JsonString)");
</script>

Так гораздо чище, и на самом деле нет веской причины, чтобы ваш контроллер делал это, поскольку вы не запрашиваете объект через AJAX.

Вы можете создать расширение HtmlHelper следующим образом, и вместо использования JsonResult используйте строго типизированное представление (при условии использования JSON.Net):

public static class HtmlHelperEx
{
    public static string ToJson(this HtmlHelper html, object obj)
    {
        return JsonConvert.SerializeObject(obj);
    }
}

Действие контроллера:

public ActionResult Index() 
{
   return View(new ModelToSerialize());
}

Тогда используйте это по вашему мнению как:

@model ModelToSerialize

<script type="text/javascript">
    var myObj = @Html.ToJson(Model)
</script>
<script>
  var myObj = '@Html.RenderPartial("Getthethings","controller name");'
</script>

Вы теоретически сможете сделать это так:

<script>
  var myObj = json.parse('@Html.RenderPartial(MVC.MyController.GetTheThings());');
</script>

Хотя, GetTheThings() здесь на самом деле не будет стрелять, это просто заполнитель T4MVC. Вы, вероятно, должны сохранить свое значение в модели представления и поместить его в javascript, как показано ниже. Если вы хотите сделать отдельный вызов контроллеру, чтобы получить это значение, это должен быть вызов ajax.

public class MyController
{ 
    public ActionResult MyView(){
        var vm = new MyViewModel();
        vm.MyObjectAsJsonString = GetMyJsonString();
        return View(vm);
    }
    public string GetMyJsonString(){
         return ""; //get your json 
    }
}

public class MyViewModel
{
    public string MyObjectAsJsonString{ get; set; }
}

@model MyViewModel
<script>
  var myObj = json.parse('@Model.MyObjectAsJsonString');
</script>

Чтобы сделать это через AJAX:

<script>
    $.ajax({
        url: '@Url.Action(MVC.MyController.GetTheThings())',
        type: 'get',
    }).done(function (result){
        var myObj = result;
    });
</script>

Используйте обертку @Html.Raw(...).

В моем собственном проекте я имею в виду существующую модель, исходящую от самого контроллера, но нет причины, по которой вы не можете получить тот же эффект, что и частичный... это просто не основная цель использования асинхронных вызовов.... что вы должны использовать вместо того, чтобы полагаться на движок рендеринга html для выполнения своей "грязной" работы.

Другие вопросы по тегам