Одно представление для разных моделей, которые все наследуются от BaseModel - PullRequest
1 голос
/ 28 июля 2011

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

Почему я не хочу использовать разные / строго типизированные представления? Потому что, скажем, я построю ламповый цех, а базовая модель определяет лампу. Таким образом, все модели, которые наследуют базовую модель, представляют собой лампы с одинаковыми базовыми свойствами и 1,2,3 особыми свойствами. Я думаю, что нет необходимости создавать 30-40 видов для почти одинаковых моделей.

Ответы [ 4 ]

0 голосов
/ 28 июля 2011

Как вы сказали, все лампы одинаковы, за исключением нескольких дополнительных свойств.Представьте, что свойства являются расширениями базового класса.Базовый класс допускает существование расширений (через LampSpecialProperties), но не заботится об их содержимом.Затем вы можете определить модели, подобные этой

public class LampViewModel
{
   public string SomeProperty {get;set}
   public LampSpecialProperties SpecialProperties {get;set;}
}

public abstract class LampSpecialProperties
{ }

public class SomeConcreteLampSpecialProperties : LampSpecialProperties
{
     public string BrightnessLevel {get;set;}
}

. В вашем представлении отобразите свойства базовой модели лампы, а затем свойства расширения

@model LampViewModel
... some shared properties    
@Html.DisplayFor(model => model.SpecialProperties)

. В Views / DisplayTemplates вы можете иметь шаблоны для каждогоконкретная реализация этих LampSpecialProperties

@model SomeConcreteLampSpecialProperties
@Html.DisplayFor(model => model.BrightnessLevel)

Для другой лампы

@model SomeAnotherConcreteLampSpecialProperties
@Html.DisplayFor(model => model.FuelConsumption)// sounds scarry :)

И так далее для всех расширений лампы.

Но это все о вашей сфере деятельности и бизнеселогика.Если ваш бизнес требует 30-40 классов моделей, вы должны создать их один за другим

0 голосов
/ 28 июля 2011

Вы можете использовать viewModels, чтобы справиться с этим. В MVC viewModels - это классы, которые создаются для (1) предоставления строго типизированного класса представлению и (2) удаления представления из модели.

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

Это хорошая статья на эту тему: http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

0 голосов
/ 28 июля 2011

Не могли бы вы определить представление BaseLamp, которое будет отображать все базовые свойства вашего представления, а затем создать что-то вроде представления ExtendedLamp, которое отображает представление BaseLamp и затем его дополнительные поля?

0 голосов
/ 28 июля 2011

Почему бы вам не создать строго типизированное представление для вашей базовой модели?

Вы можете вызвать это представление, указав его имя в return View("myViewName", myModel);.

Другой вариант будетиспользуйте шаблоны T4 для генерации полей формы из модели: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

Затем просто вызовите @Html.EditorModelFor(), чтобы сгенерировать HTML для модели.

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