ASP.NET MVC: наличие одной модели для всех видов - PullRequest
1 голос
/ 21 сентября 2010

Мне нравится, как работает привязка модели в django: вы отправляете нужные вам материалы в стиле Json:

'param1': val,
'param2': val

В ASP.NET MVC вы не можете сделать это в первую очередь, потому что C #статический язык.Вы можете использовать ViewData, но это некрасиво и не рекомендуется.

Поэтому мне пришлось создавать десятки моделей представления для каждого представления: IndexViewModel, AboutViewModel и т. Д. И сегодня у меня появилась идея:почему бы просто не создать один класс Model и заставить Visual Studio сгенерировать все необходимые поля?Это почти как в django.

return View(new Model
            {
                Param1 = "asd",
                Param2 = "sdf"
            });

Param1 и Param2 не являются членами класса Model, но Visual Studio автоматически сгенерирует их.

Теперь мой вопрос: это сработает?Дело в том, что в этом классе Model будет много полей.И когда мы передаем его представлению, будет использоваться только небольшой процент полей, созданных для этого представления.Будет ли плохая производительность?

Спасибо

Ответы [ 4 ]

2 голосов
/ 21 сентября 2010

Взгляните на Clay «податливую» объектную модель, используемую в Orchard Project.

http://weblogs.asp.net/bleroy/archive/2010/08/16/clay-malleable-c-dynamic-objects-part-1-why-we-need-it.aspx

http://weblogs.asp.net/bleroy/archive/2010/08/18/clay-malleable-c-dynamic-objects-part-2.aspx

2 голосов
/ 21 сентября 2010

Если у вас есть все эти свойства в вашей ViewModel, которые не используются (то есть, null или что-то еще), это на самом деле не повлияет на производительность. Однако это повлияет на ваш дизайн.

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

Учтите это ....

У вас есть общая модель с 15 свойствами, и вы задаете только несколько из них. Кто-то еще разрабатывает новое представление и смотрит на модель, он может не знать, какие из этих свойств отправлены и при каких условиях они установлены. Следовательно, они могут пытаться отобразить данные, которые не существуют. Это не очень чистый подход.

Я бы придерживался отдельных моделей представлений и там, где между представлениями есть общие функциональные возможности, создавал бы абстракцию или базовую модель представления, из которой могут расширяться другие модели представлений.

Редактировать: Еще одну вещь, которую вы можете сделать, - это использовать новый синтаксис MVC 3 (все еще в режиме предварительного просмотра) (динамический) для непосредственной установки свойств ViewData, как если бы они были свойствами.

Так что вместо того, чтобы делать

ViewData["FirstName"] = "Bob";

Вы можете сделать

ViewModel.FirstName = "Bob";

Это дает вам динамические переменные автоматически в MVC 3.

1 голос
/ 21 сентября 2010

Нет причин, по которым это не должно работать.

Вы даже можете пропустить класс Model и создать анонимный тип только с необходимыми членами.

return View(new { Amount = 108, Message = "Hello" });

Проблема с использованием анонимногоТипы - это то, что вы отказываетесь от автозаполнения в представлении, поскольку вы не сможете печатать представление в соответствии с моделью.

0 голосов
/ 21 сентября 2010

Просто используйте dynamic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...