Зачем нужен отдельный вызов для получения Json?

#asp.net #ajax #json #asp.net-mvc-3

#asp.net #ajax #json #asp.net-mvc-3

Вопрос:

Мне нужно получить некоторый Json на стороне клиента с сервера, и это несколько хлопотно, поскольку почти все учебные пособия предполагают Ajax-вызов отдельного действия для получения Json.

Это навело меня на мысль, что должна быть какая-то причина, по которой это делается таким образом. В Asp.Net MVC мы можем передать модель вместе с представлением, чтобы получить информацию, но, похоже, мы не можем легко передать объект Json. Вместо этого вы должны выполнить отдельный вызов для получения этой информации.

Что, если информация в формате Json известна при создании страницы, почему бы не сгенерировать ее одновременно?


Извините, если я выразился недостаточно ясно. Хотя приятно слышать о способах передачи Json клиенту, вопрос на самом деле в том, есть ли конкретная причина, по которой метод вызова Ajax намного более популярен, например, безопасность или что-то в этом роде.

Ответ №1:

Можете ли вы представить что-то подобное в своем представлении? (грубый псевдокод, предполагающий использование Razor view)


< script >

var myJSON = { Field: @model.Field, Field2: @model.Field2 };

< /script >

Комментарии:

1. Я могу до определенного момента. Имея коллекцию и добавляя несколько дочерних объектов и даже вставляя ее в наблюдаемые Knockoutjs, я нахожу, что это слишком много кода для страницы cshtml. Также мои вопросы больше о том, почему это делается одним способом, а не другим. Это все еще кажется самым простым способом.

Ответ №2:

Поскольку вам не нужны оба одновременно … при первом вызове будет получен html (представление данных, представленных моделью представления), а любые вызовы ajax будут направлены на получение возможно обновленных данных (модель представления с сериализацией json).

Комментарии:

1. Я бы подумал, что это будет только в определенных случаях, когда вы, возможно, не захотите получать данные отдельно, но здесь это предполагается почти во всех случаях.

Ответ №3:

Нет причин, по которым вы не можете. Вы могли бы использовать javacript serializer для создания строки JSON, которая отображается на странице. Вы также могли бы создать действие, которое возвращает строку json, вызванную из тега script.

Если вы используете KnockOut, то вам нужен плагин сопоставления, который превращает обычный JS-объект, подобный сгенерированному выше, в наблюдаемый объект, готовый к использованию KnockOut. Смотрите здесь из info. http://knockoutjs.com/documentation/plugins-mapping.html

Ответ №4:

Вы можете использовать согласование содержимого, установив заголовок accept. Это считается лучшей практикой (и согласно некоторым RESTful).

Это также должно поддерживаться и реализовываться на сервере. ASP NET MVC не упрощает поддержку согласования содержимого, и вы должны реализовать это самостоятельно с помощью if-else или с помощью ActionFilter и реализации action selector.