Viewmodel и динамические меню лучшие практики - ASP.NET MVC - PullRequest
4 голосов
/ 23 марта 2011

Я запускаю новый сайт в asp.net MVC с динамическим меню, которое меняется в зависимости от пользователя. Но это не все. Я использую 2 разных макета (раскладки Razor) в зависимости от пользователя, и у двух разных макетов есть разное меню. Итак, у меня есть 2 разных макета с 2 разными динамическими меню.

Я хотел бы использовать один и тот же вид для 2 макетов с одной моделью представления для каждого вида. Я использую фильтр действий, чтобы определить макет. Является ли хорошей идеей спроектировать базовый класс «ViewModel», содержащий данные для отображения обоих меню (даже если каждый раз создается только одно меню) и создать дочерний элемент этого базового класса для всей моей модели представления (по одной модели представления на представление).

Я хочу знать, хорошая ли это практика. Это тот случай, когда я должен использовать 2 вида (по одному на макет) и использовать частичные виды для общей части?

И если есть некоторые различия в том, что я хочу отображать на виде в зависимости от макета, следует ли мне использовать 2 вида вместо одного?

Есть рекомендации?

Ответы [ 3 ]

7 голосов
/ 23 марта 2011

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

public class MyViewModel
{
     public int SomeData { get; set; } // basic Stuff
     public IDynamicMenuData MenuData { get; set; }
}

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

@Html.DisplayFor(x => x.MenuData)

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

2 голосов
/ 24 марта 2011

Я бы настоятельно рекомендовал не использовать модель базового вида со свойствами меню, потому что она очень жесткая.(Что произойдет, если вы используете, например, частичные представления? Что если вы захотите сериализовать модель в JSON для AJAX? Будет ли взрываться, если вы забудете наследовать от базы?) Вместо этого я рекомендую создать отдельную модель представления для вашегоменю, которое можно сохранить в коллекции ViewData.Сделайте это в своем фильтре.

Если вы в конечном итоге используете базовую модель, здесь - это другой ответ, который имеет хороший пример.

0 голосов
/ 23 марта 2011

Я думаю, что использование двух представлений против одного представления с логикой if / else сводится к повторному использованию кода. Если два меню сильно отличаются, я бы предложил создать два представления. Если меню в основном одинаковые, за исключением нескольких пунктов меню, я бы просто использовал одно представление с некоторой логикой if / else.

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