Визуализация 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 для выполнения своей "грязной" работы.