Лучшая архитектура MVC для нескольких различных известных целей браузера? - PullRequest
1 голос
/ 21 сентября 2010

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

  1. Размер экрана и ориентация. У нас есть некоторые в Full HD, а другие в 800x480. Некоторые из них являются портретными, а некоторые - пейзажными, но все они известны и не изменятся.
  2. Из-за этого представления будут принципиально иными и будут спроектированы таким образом.

У меня такой вопрос: я должен создать отдельный контроллер для каждого типа цели и страницы, или контроллер должен каким-то образом интерпретировать, какой тип цели и предоставить соответствующее представление? Например, я должен сделать это:

TargetType1AccountController
TargetType1HomeController
TargetType2AccountController
TargetType2HomeController

или это:

AccountController / TargetType1View
AccountController / TargetType2View
HomeController / TargetType1View
HomeController / TargetType2View

Ответы [ 3 ]

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

Я бы порекомендовал вам написать собственный движок просмотра. Таким образом, ваша структура может выглядеть так:

  • Просмотров
    • Home
      • Index.aspx // версия по умолчанию
      • UA1
        • Index.aspx // версия для пользовательского агента 1
      • UA2
        • Index.aspx // версия для пользовательского агента 2
    • Общий

И тогда есть пользовательский механизм просмотра:

public class CustomViewEngine : WebFormViewEngine
{
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        string ua = controllerContext.HttpContext.Request.UserAgent;
        if (ua == "UA String 1")
        {
            return base.FindView(controllerContext, "UA1/" + viewName, masterName, useCache);
        }
        if (ua == "UA String 2")
        {
            return base.FindView(controllerContext, "UA2/" + viewName, masterName, useCache);
        }

        return base.FindView(controllerContext, viewName, masterName, useCache);
    }
}

И, наконец, зарегистрируйте механизм просмотра в Application_Start:

ViewEngines.Engines.Clear();  
ViewEngines.Engines.Add(new CustomViewEngine());

Таким образом, ваш контроллер и действия строго одинаковы, и на основе заголовка HTTP User-Agent будет использоваться правильное представление. Все, что вам нужно сделать, когда вам нужно обработать UA3, это добавить соответствующий вид в папку UA3. Не нужно трогать контроллеры и модели.

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

Я бы пошел с вашим вторым подходом и:

  • попробуйте сделать как можно больше с CSS, прежде чем прибегать к альтернативным представлениям
  • если нужны альтернативные представления, они должны использовать один и тот же контроллер, так как большая часть логики должна быть идентичной или очень похожей
  • используйте partials для обмена фрагментами HTML, общими для представлений
1 голос
/ 21 сентября 2010

Все будут отображать в основном одни и те же данные, но цели различаются по нескольким причинам:

  1. Размер экрана и ориентация.У нас есть некоторые в Full HD, а другие в 800x480.Некоторые из них являются портретными, а некоторые - пейзажными, но все они известны и не изменятся.
  2. Из-за этого виды будут принципиально иными и будут спроектированы таким образом.

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

Если это только визуальные аспекты, вы сможете сделать это с помощью css.Проверьте все альтернативные проекты в css Zen Garden , все имеют одинаковый html.

Если вам нужны разные виды, убедитесь, что они особенно просты.Переместите как можно больше к контроллеру / моделям представлений.

Существует более 1 способа применения различных представлений с одним и тем же контроллером:

  • Пользовательский движок, такой как упомянутый @Darin.Удостоверьтесь, что использование представления по умолчанию, если конкретное не определено, позволяет использовать определенные представления только таким образом, когда вам это действительно нужно.
  • Фильтр действий, который переключает используемое представление.
  • Пользовательский результат просмотра, который создает новый результат просмотра, указывающий на соответствующий просмотр.Аналогично этому asp-net-mvc-hybridviewresult-viewresult-частичное viewresult (это для частичного результата против viewresult, но концепция та же).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...