#javascript #visual-studio #razor
#javascript #visual-studio #razor
Вопрос:
Я передаю объект JSON в Javascript через ViewBag со следующим кодом, на мой взгляд:
var jsonResultData = @Html.Raw(ViewBag.JsonResultData);
Этот подход работает нормально, но VisualStudio продолжает выдавать мне предупреждение «Условная компиляция отключена». Кажется, VS хочет заключить в кавычки @Html.Raw (ViewBag.JsonResultData); Если я добавляю кавычки, jQuery видит переменную как строку, а не как данные JSON.
Ошибочен ли мой подход? Есть ли другой способ, которым я должен подойти к этому? Если нет, могу ли я отключить предупреждение VS? Досадный побочный эффект предупреждения заключается в том, что я не могу отформатировать свой код с помощью CTRL K-D.
Комментарии:
1. Это Javascript, а не jQuery.
Ответ №1:
Почему вы используете ViewBag? Я полагаю, что в вашем действии контроллера вы вручную сериализовали некоторую модель в JSON, не так ли? Что-то вроде этого:
public ActionResult Foo()
{
var model = ...
ViewBag.JsonResultData = new JavaScriptSerializer().Serialize(model);
return View(model);
}
Я бы не рекомендовал вам это делать. Вместо этого сделайте это:
public ActionResult Foo()
{
var model = ...
return View(model);
}
и, по вашему мнению:
<script type="text/javascript">
var jsonResultData = @Html.Raw(Json.Encode(Model));
</script>
Что касается предупреждения, ну, Razor Intellisense далек от совершенства. Вы действительно можете получить некоторые предупреждения, особенно при смешивании razor с javascript. Мы можем только надеяться, что они исправят это в будущих версиях ASP.NET MVC. На данный момент игнорируйте эти предупреждения. Честно говоря, когда я работаю с представлением, я больше не смотрю на предупреждения или ошибки в Visual Studio, поскольку я заранее знаю, что они глючат, и мое приложение отлично работает при запуске.
Комментарии:
1. Дарин, это правильно. Я сериализую данные в своем контроллере. Я использую ViewBag, поскольку я просто передаю строки ошибок. Я не сериализую всю модель. Почему вы рекомендуете кодировать данные на клиенте с помощью Json. Кодировать, а не делать это на стороне сервера?
2. @Mark S., поскольку я считаю использование ViewBag / ViewData плохой практикой в ASP.NET MVC. Он слабо типизирован, вы не получаете Intellisense, вы полагаетесь на волшебные строки, ваши модульные тесты чрезвычайно хрупки для изменений, ваш код не подходит для рефакторинга, … И поскольку у вас уже есть действие контроллера, возвращающее строго типизированную модель представления в представление, зачем писать дополнительный бессмысленный код в этом действии контроллера? Зачем делать это действие fat, когда все, что вам нужно, находится внутри модели? И затем в представлении, если вам нужно получить к нему доступ с помощью javascript, просто сериализуйте эту модель в JSON.