ASP.NET MVC 3.0 - Почему строго типизированная модель в представлении, если статическая компиляция не происходит? - PullRequest
6 голосов
/ 06 июня 2011

Я активно разрабатываю настольные приложения, локальные и сетевые службы, некоторые классические ASP.NET и т. Д., Поэтому я привык к статической компиляции и статическому анализу кода. Теперь, когда я (наконец) изучаю ASP.NET MVC 3.0 , я вижу, что многие эксперты и опытные разработчики ASP.NET MVC рекомендуют использовать строго типизированные представления в ASP.NET MVC 3.0 ( где применимо).

Я предполагаю, что "строго типизированный" означает запись @model=... в верхней части кода представления. Но при этом я получаю только IntelliSense , никакой статической проверки кода не происходит. Я могу написать все, что захочу, в операторе @model в cshtml , и он скомпилируется и запустится. Следовательно, Model.Anything также компилируется. Фактически, если я не печатаю @model, я могу динамически использовать любую модель, которая мне нужна, которая имеет "совместимые" свойства и методы.

Я привык к «строго типизированному» значению «не будет компилироваться», как LINQ для независимо от того, просто не будет компилироваться, если вы не получите правильные свойства. Есть ли какая-то другая цель для @model, кроме IntelliSense и ошибки run-time , и почему она называется строго типизированной, если на самом деле это не так?

Строгая типизация, Значения в компьютерной литературе

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Представления компилируются во время выполнения по умолчанию. Вы можете изменить файл проекта (csproj) для компиляции представлений при сборке приложения, установив следующее свойство:

<MvcBuildViews>true</MvcBuildViews>

Недостатком этого подхода является то, что ваше время сборки значительно увеличится. Вам следует только установить для этой опции значение true для сборок релиза.

Вы можете отредактировать файл своего проекта, выгрузив проект, щелкнув правой кнопкой мыши по проекту и выбрав Edit ProjectFile

0 голосов
/ 26 июня 2011

модель - это новый динамический тип в .net 4.0, поэтому эти типы разрешаются во время выполнения, а не во время компиляции.

0 голосов
/ 06 июня 2011

Возможно настроить ваш проект так, чтобы он включал представления в вашу компиляцию. Это было бы, где статическая типизация полезна. Другое место было бы во время выполнения, если вы попытаетесь передать модель, которая не соответствует ожидаемой модели, вы немедленно получите исключение. Если бы вы вводили представления динамически, вы бы не знали, что ваша модель недействительна, пока ваше представление не попыталось получить доступ к свойству модели и не обнаружило, что его там нет.

Второй сценарий также является кошмаром, если вы передаете неправильный объект модели, но он имеет то же имя, что и ожидаемая модель. Тогда вы просто получаете неверные данные и отладка превращается в ад.

...