ASP.NET MVC, использующий ViewData в javascript

#javascript #asp.net-mvc

#javascript #asp.net-mvc

Вопрос:

В настоящее время я создаю веб-сайт в ASP.NET MVC. Я пытаюсь получить доступ к ViewData в javascript.

Есть ли какой-либо способ, которым я могу получить доступ к строковому значению с помощью javascript в представлении, которое было сохранено в ViewData в действии контроллера. ( Я не могу определить правильный синтаксис).

Я хотел бы сделать что-то вроде..

var str = ViewData["Текст"];

Я попробовал следующее:

var str = <%=ViewData[«Текст»] %>

но это не сработало.

Может кто-нибудь, пожалуйста, помочь.

Спасибо.

Ответ №1:

Вот так (Razor):

 var str = @Html.Raw(Json.Encode(ViewData["Text"]));
  

или (веб-формы), используя JavaScriptSerializer (и после импорта соответствующего пространства имен в вашу веб-форму — System.Web.Script.Serialization ):

 var str = <%= new JavaScriptSerializer().Serialize(ViewData["Text"])) %>;
  

И, пожалуйста, не используйте ViewData в ASP.NET Приложение MVC. Используйте модели представлений и строго типизированные представления, чтобы ваш код выглядел следующим образом:

 var str = <%= new JavaScriptSerializer().Serialize(Model.Text) %>;
  

Этот метод еще круче, поскольку теперь вы можете сериализовать всю модель представления в формате JSON:

 var model = <%= new JavaScriptSerializer().Serialize(Model) %>;
var str = model.Text;
  

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

1. Спасибо за подробный ответ, сэр.

2. это очень старый пост, но я попытаю счастья: где бы вы разместили этот код? Внутри @section Scripts такие вещи, как @Html... , не работают

3. var str = @Html.Raw(Json.Encode(ViewData["Text"])); идеально!

Ответ №2:

Это должно быть:

 var str = '<%= ViewData["Text"] %>';
  

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

1. Нет, это очень плохо. Никогда не используйте что-то подобное в реальном приложении. Что, если текст содержит цитату? Этот код довольно уязвим для XSS-атак, особенно если этот текст поступает из пользовательского ввода.

2. Он уже был так близок, что я подумал, что было бы полезнее ответить на вопрос, который у него был, чем усложнять его.

3. это не ответ на вопрос!!! Это приглашение к атакам XSS и реклама плохих практик. Мы не говорим здесь о чрезмерном усложнении. Мы говорим об ответе на вопрос. Как вы можете сказать, что это отвечает на вопрос? Я имею в виду, что этот код скоро сломается, и это будет предметом еще одного вопроса по SO. Я не могу поверить, что за этот вопрос проголосовали, и вы еще не удалили его, чтобы он не был проиндексирован, поскольку кто-то действительно может использовать это в своем приложении.

4. Ваш ответ явно более широко применим. Учитывая ваши комментарии здесь и в вашем собственном ответе, я уверен, что он поймет, что нужно кодировать и экранировать, если он ожидает, что в его ViewData будут апострофы или данные, сгенерированные пользователем. Я также считаю, что то, что он увидел, что было не так с его собственным, более простым кодом, ценно.

5. Я согласен. Ответ Дарина — правильный ответ, но полезно знать и другой (хотя и «не рекомендуется») способ. 1 вам обоим.