Каков наилучший практический подход к обработке мобильной версии вашего приложения asp.net mvc 2 - PullRequest
2 голосов
/ 05 апреля 2011

Красота MVC заключается в разделении интересов, особенно в мире веб-форм Asp.net.

Теперь у меня есть сайт MVC с контроллерами, действиями, моделью и представлениями.

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

Однако, каков наилучший подход для такого «обмена», особенно в Asp.net MVC 2?

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

Иногда даже действия в контроллере содержат условия, основанные на том, является ли это вызовом jax, для возврата различных представлений, например, частичных представлений.

Итак, с учетом этого, скажем, я доволен своим текущим сайтом, но теперь я хочу создать, скажем, его версию для iPad. Так что он может содержать специальные библиотеки js для сенсорных событий, и представления могут быть менее многословными, и, конечно, CSS разные.

как мне встроить это в мой проект MVC 2?

Приветствия

1 Ответ

1 голос
/ 05 апреля 2011

Один из подходов, вне моей головы, состоит в том, чтобы создать свой собственный ViewEngine и переопределить FindView, он имеет доступ к контексту контроллера и, следовательно, к HttpContext. Вы можете использовать это для выбора различных представлений, основанных на пользовательском агенте, с использованием некоторого шаблона, например добавления _ipad или чего-то подобного.

Быстрый пример:

Global.asax

protected void Application_Start()
{
     RegisterRoutes(RouteTable.Routes);
     ViewEngines.Engines.Clear();
     ViewEngines.Engines.Add(new CustomViewEngine());
     AreaRegistration.RegisterAllAreas();
}

CustomViewEngine:

public class CustomViewEngine : WebFormViewEngine
{
    protected override IView CreateView(ControllerContext controllerContext, string viewPath,string masterPath)
    {
         if (controllerContext.HttpContext.Request.UserAgent.Contains("ipad"))
        {
             return base.CreateView(controllerContext, viewPath.Replace(".aspx","_ipad.aspx").Replace(".ascx","_ipad.ascx"), masterPath);
         }
         else
         {
             return base.CreateView(controllerContext, viewPath, masterPath);
        }
     }
}
...