Создание необработанного массива json для просмотра в ASP.NET MVC - PullRequest
5 голосов
/ 03 ноября 2010

Я использую ASP.NET MVC и пытаюсь сгенерировать фрагмент JavaScript как часть рендеринга представления.У меня есть модель, которая представляет массив простых типов, и я хотел бы сгенерировать эквивалентный массив javascript / json в представление, чтобы я мог работать с ним, используя jQuery.Поэтому, учитывая следующую модель:

public class Info {
   public string Name {get;set;}
   public int ID {get; set;}
}

public class InfoModel{
   public Info[] InfoList {get;set;}
}

... Я хотел бы создать массив javascript, похожий на этот:

var infoList = [
      {
         Name = "...",
         ID = 1
      } ,
      {
         Name = "...",
         ID = 2
      },
      ....
      {
         Name = "...",
         ID = N
      }];

Есть ли хороший и краткий способ сделать это вПохоже, у меня возникнут проблемы с кодировкой кавычек, если я попытаюсь сгенерировать модель в формате json, поэтому в настоящее время я могу сгенерировать ее только с использованием некоторого спагетти / классического кода asp, который я бы предпочел заменить на хорошийliner.

EDIT: обратите внимание, что я не ищу, чтобы контроллер возвращал JsonResult, я хочу, чтобы мое представление содержало массив JavaScript, сгенерированный из моей модели, в одну строкукод (если возможно)

РЕДАКТИРОВАТЬ: Я получил часть пути, но, похоже, борется с кодированием.Этот код в представлении:

<script>
var list = <%: HtmlExtension.ToJson(Model.InfoList) %>;
</script>

(где ToJson инкапсулирует преобразование в строку с использованием JavaScriptSerializer) выводит некоторые ошибки кодирования:

var info = [{&quot;Name&quot;:&quot;Low End&quot;,&quot;ID&quot;:1}];

.. что не то, что я искал.Я мог бы сделать это:

var info = <% Response.Write(HtmlExtension.ToJson(Model.InfoList)); %>;

, который работает, но не выглядит блестящим.Должен ли я явно игнорировать кодировку, как показано (Вывод является нормальным, а не сгенерированным пользователем, так что это не может быть проблемой), или я пропускаю что-то еще, что делает его менее классическим asp?

Ответы [ 2 ]

5 голосов
/ 03 ноября 2010

Кажется, у вас проблема с кодировкой.Я полагаю, у вас есть два варианта:

  1. Когда вы создаете свое расширение, убедитесь, что оно возвращает MvcHtmlString вместо обычного string или ...
  2. ВместоПри использовании стиля <%: ... %> для записи кода используйте <%= ... %>, чтобы не выполнять кодирование.
1 голос
/ 03 ноября 2010

Да, есть хороший способ:

InfoModel viewModel; // get this from wherever
return Json(viewModel);

MVC переведет коллекцию в соответствующий JSON.

Это вернет JsonResult (т.е. необработанный JSON).

Это то, что вы ищете?

Если вы хотите сделать что-то подобное в вашем представлении:

<script type="text/javascript>
   var json = <%: Model.JsonStuff %>
   // more js
</script>

Тогда приведенный выше пример не сработает.

Вам придется сериализовать его вручную при создании модели ViewModel.

EDIT

Вот пример того, как вы могли бы сериализовать ваши данные.

JavaScriptSerializer js = new JavaScriptSerializer();
var listOfInfos; // this will be a collection (e.g List) of Infos.
var viewModel = new InfoModel
                {
                   InfoList = js.Serialize(listOfInfos);
                };
return View(viewModel);

Пока listOfInfo реализует IEnumerable, он будет сериализован в массив JSON.

Возможно, вам придется немного поиграть с вашей моделью представления, но это должно поставить вас на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...