Как генерировать и передавать переменную JavaScript из MVC Controller? - PullRequest
0 голосов
/ 13 ноября 2009

Я пытаюсь заполнить объект JSON списком элементов из базы данных при первой загрузке страницы. Этот список предметов происходит из базы данных. Прямо сейчас я строго набрал View и прохожу список элементов, чтобы создать неупорядоченный список HTML, а затем в JavaScript создаю объект JSON из того, что было выведено в HTML. Но это неуклюже.

В идеале я хотел бы взять эти данные из базы данных в Контроллере, заполнить объект (или переменную) и отправить эту переменную в JavaScript для использования там, и пропустить промежуточный HTML-код (HTML будет обновляться динамически с использованием jQuery). Переменная, которая поступает в JavaScript, не обязательно должна быть объектом JSON, но она должна содержать информацию, которую я заполнил из контроллера. Оттуда я могу построить объект JSON в JavaScript.

Друг сказал мне, что это возможно, и в настоящее время он использует этот метод, но никогда не пробовал его в ASP.NET MVC. Есть идеи?

ПОЯСНЕНИЕ: Я должен был быть более ясным в своем исходном вопросе, но я пытаюсь отправить переменную / JSON во внешний файл внешний JavaScript, а не обрабатывать JSON Объект / создать его внутри тегов.

Ответы [ 6 ]

2 голосов
/ 13 ноября 2009

Вы можете назначить JSON непосредственно переменной [javascript], так как это допустимый javascript.

.NET включает сериализатор в

System.Web.Script.Serialization.JavaScriptSerializer

В вашем контроллере, вероятно, есть что-то вроде списка, который вы передаете:

ViewData["MyData"] = new List<int>() { 1, 2, 3 };

Тогда вы можете разобрать его внутри вида с помощью:

var serializer = new JavaScriptSerializer();
string data = serializer.Serialize(ViewData["MyData"]);
// data will be [1,2,3] I think
// objects with members will have data like { "MyVariable": "MyValue", ...}

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

var MyData = new Array();

MyData.push(1);
MyData.push(2);
MyData.push(3);
1 голос
/ 13 ноября 2009

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

1 голос
/ 13 ноября 2009

В вашем контроллере просто

return Json(yourObject);

вместо

return View(yourObject);

инфраструктура MVC будет сериализовать практически все в JSON, просто следите за объектами linq-to-sql, которые имеют циклическое отношение.

Если вы затем вызовете это с помощью jQuery ajax, вы получите объект JSON в «data».

Если вы хотите, чтобы ваш контроллер мог возвращать html (просмотр) или json, вы можете проверить, является ли запрос запросом ajax, например:

if(Request.IsAjaxRequest())
{

}
1 голос
/ 13 ноября 2009

Вот как Flicker решил эту проблему сравнительно недавно:

http://code.flickr.com/blog/2009/03/18/building-fast-client-side-searches/

Самый быстрый способ сделать это, согласно их наблюдениям, это отправить данные в виде текста с разделителями, а затем использовать String.prototype.split () для выполнения работы, а не анализатор JSON.

Так как мы уже обнаружили, что некоторые методы манипуляции со строками не очень хорошо работал на больших струнах, мы ограничились методом что мы знали, чтобы быть быстрым: split (). Мы используемые управляющие символы для разделения каждый контакт и другой элемент управления символ для разграничения полей внутри каждый контакт. Это позволило нам разобрать строка в контактные объекты с один разделить, а затем пройти через это массив и снова разделить на каждую строку.

0 голосов
/ 13 ноября 2009

Вы можете просто отобразить немного JavaScript вместо неупорядоченного списка в HTML. Так что, если вы хотите получить доступ к списку объектов JSON, то что-то вроде

<html>
<body>
  <div>...</div>

  <script type="text/javascript">
    var list = {
      <% foreach(var item in Model) { %>
        { x:<%= item.X %>, Y:<%= item.Y %>, Z:<%= item.Z %> },
      <% } %>
    };
    // or
    var x = <%= Model.MySerializedJson %>
  </script>
</body>
</html>

Или вы можете использовать Ajax-вызов после отображения страницы.

0 голосов
/ 13 ноября 2009

Да. Найдите сериализатор JSON для языка, который вы используете здесь: http://www.json.org/

Затем, после того как вы создали и заполнили свои объекты данных, вы сможете вызвать метод .toJSONString() (или аналогичный), который выдаст JSON для передачи клиенту.

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