2009-12-17 1 views
0

Каждый класс контроллера в моем проекте определяется базовым классом контроллера, точно названным BaseController.Является ли класс BaseViewData свойством класса BaseController плохой идеей?

Все данные обзора содержатся в классе с именем BaseViewData (который в будущем может стать базовым контроллером для более конкретных классов данных представления).

Я создал свойство BaseViewData на BaseController, так как каждый контроллер требует доступа к данным внутри строго типизированных данных базового представления (и BaseController выполняет некоторую работу по предварительному заполнению некоторых свойств BaseViewData).

Я сделал это потому, что:

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

  2. придерживаюсь DRY, я удалось консолидировать ALOT кода , который ранее был рассеянной в течение каждого контроллера.

Однако в первый раз я попытался это сделать. Поэтому я мог бы забыть о проблеме, готовившей вывести свою уродливую голову. Итак:

Является ли класс BaseViewData свойством класса BaseController плохой идеей? Если да, то почему?

Update 1:

Мой BaseController выглядит примерно так (это больше, но это должно получить точку в поперечнике):

public class BaseController 
{ 
    public string Language {get; set;} 
    public string Locale {get; set;} 
    public BaseViewData Data {get; set;} 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    var l = (RouteData.Values["language"] != null) ? RouteData.Values["language"].ToString() : "en"; 
    if (l.ToLower().Contains("en")) 
    { 
     l = "en"; 
    } 
    else 
    l = "ja"; 

    Data.Language = l; 
    } 
} 

Мой BaseViewData выглядит следующим образом (опять же, есть еще .. .):

public class BaseViewData 
{ 
    public string Language {get;set;} 
    public string Locale {get;set;} 
    public bool IsOwner {get;set;} 
    public string Menu1 {get;set;} 
    public string Menu2 {get;set;} 
    public string Menu3 {get;set;} 

    public IPagedList<TYPE> ListOfTYPE {get;set;} 
    etc... 
} 
+1

Интересная идея. Я мог бы использовать IViewData сам с BaseController. Я бы подумал, что мой IViewData будет просто общим DTO без каких-либо функций, таких как: UserId, UserName и IsLoggedIn или что-то в этом роде. Мне было бы интересно узнать, что у вас есть в BaseViewData. – rball

ответ

1

Для единственного сайта, с которым я когда-либо работал в ASP.NET MVC, это именно то, что мы сделали. Самое приятное в том, что мы смогли сохранить значения в классе BaseViewData, которые были необходимы на главной странице. Поскольку у каждого представления был экземпляр некоторых производных BaseViewData, мы могли бы безопасно использовать данные в BaseViewData на главной странице.

+0

Именно это я и делаю. Отлично работает, просто надеюсь, что я не собираюсь поднять монстра. : D – Chaddeus

2

Компонент меню вашей идеи может не понадобиться, с помощью бета-версии ASP.NET MVC 2 вы можете использовать Http.RenderAction для вызова действия контроллера непосредственно из представления (например, действие BuildMenu, которое извлекает элементы меню из хранилища и возвращает PartialView.

Смотреть больше Haacked информации ...

Кроме того, для более простого содержания, таких как язык/локали, это может быть необходимо, если вы используете ASP.NET Профиль поставщика (доступный через оба контроллера & вид).

+0

У вас есть пример веб-сайта ASP.NET MVC с использованием Провайдера профилей таким образом? – Chaddeus

+0

Я копаю идею, что вы можете вызвать действие непосредственно через RenderAction ... hmm ... – Chaddeus

+0

Я думаю, что ASP.NET MVC 2 может вызвать серьезную переписку с моим приложением ... но может стоить того и в конечном итоге , – Chaddeus

1

ИМХО, вы создаете монстра.

Поскольку ваше приложение растет все больше и больше функций, а глобальные экраны будут испечены в этой модели базового вида. Это неизбежный будет класс кода для кода, например, файлы .aspx.cs, которые пытается избежать.

Лучше использовать такие вещи, как MVC2 RenderAction или материал SubController из MVC Contrib, даже если это означает, что немного нарушает шаблон MVC.

Посмотрите на сайт, похожий на CNN или даже на Stackoverflow.com, у вас будет десяток методов, прежде чем вы это узнаете.

+0

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

+0

И, фактически, даже если бы это стало немного жира - что было бы вредом в этом «Есть ли какая-то производительность при передаче большого строго типизированного объекта viewdata (даже если многие свойства были пустыми?)? Просто любопытно ... спасибо. – Chaddeus

+1

Вы нарушаете S ingle Ответственный директор. Ваша модель базового представления в конечном итоге будет отвечать за многие вещи. – jfar