Ошибка представления Visual Studio «Условная компиляция выключена» при передаче объекта JSON

#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.