【问题标题】:What's the best practice approach to handling a mobile version of your asp.net mvc 2 app处理您的 asp.net mvc 2 应用程序的移动版本的最佳实践方法是什么
【发布时间】:2011-04-05 04:49:51
【问题描述】:

MVC 的美妙之处在于关注点分离,尤其是来自 Asp.net 网络表单世界。

我现在有一个包含控制器、动作、模型和视图的 MVC 站点。

查看我的网站,我可以看到要提供它的移动版本,我所要做的就是换掉它的视图部分,并保持控制器、动作和模型不变。

但是,这种“交换”的最佳方法是什么,特别是在 Asp.net MVC 2 中?

控制器和视图之间确实存在一些耦合。例如,某些操作反映了视图的名称,因此按照约定进行连接。有时在返回模型时会显式定义视图。

有时,控制器中的操作包含基于条件的条件,这是一个 jax 调用,以返回不同的视图,例如部分视图。

因此,考虑到这一点,假设我对我当前的网站很满意,但现在我想创建它的 iPad 版本。所以它包含用于触摸事件的特殊 js 库,并且视图可能不那么冗长,当然 CSS 也不同。

如何将它构建到我的 MVC 2 项目中?

干杯

【问题讨论】:

    标签: visual-studio-2010 asp.net-mvc-2 mobile-safari


    【解决方案1】:

    我想到的一种方法是创建自己的 ViewEngine 并覆盖 FindView,它可以访问控制器上下文,因此可以访问 HttpContext。您可以使用它来根据用户代理选择不同的视图,使用某种模式,例如附加 _ipad 或其他东西。

    快速示例:

    全球.asax

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

    自定义视图引擎:

    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);
            }
         }
    }
    

    【讨论】:

    • + 1 嗯,好主意。你有使用这个的例子吗?我不希望它太矫枉过正......?
    • 只是一个警告 - 你要确保移动用户可以覆盖它并根据需要使用完整的网站。
    • @Kragen - 是的,当然。它可能基于 url 值而不是用户代理。
    • @andy,我提供了一个应该可以工作的示例(虽然我不知道 ipad 的用户代理是什么!),但这不完全是生产代码!我完全同意 Kragen 的观点,仅仅通过用户代理是不对的。
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多