#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 вам обоим.