Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 什么';这是处理asp.net mvc 2应用程序移动版本的最佳实践方法_Visual Studio 2010_Asp.net Mvc 2_Mobile Safari - Fatal编程技术网

Visual studio 2010 什么';这是处理asp.net mvc 2应用程序移动版本的最佳实践方法

Visual studio 2010 什么';这是处理asp.net mvc 2应用程序移动版本的最佳实践方法,visual-studio-2010,asp.net-mvc-2,mobile-safari,Visual Studio 2010,Asp.net Mvc 2,Mobile Safari,MVC的美妙之处在于关注点的分离,特别是来自Asp.net webforms世界的关注点 我现在有了一个带有控制器、动作、模型和视图的MVC站点 看看我的网站,我可以看到,要为它的移动版本服务,我所要做的就是调出它的视图部分,保持控制器、动作和模型不变 但是,这种“交换”的最佳方法是什么,特别是在Asp.net MVC 2中 不可避免地,控制器和视图之间存在一些耦合。例如,某些操作反映视图的名称,因此按约定进行连接。有时,在返回模型时会显式定义视图 甚至有时候,控制器中的操作包含基于返回不同视图

MVC的美妙之处在于关注点的分离,特别是来自Asp.net webforms世界的关注点

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

看看我的网站,我可以看到,要为它的移动版本服务,我所要做的就是调出它的视图部分,保持控制器、动作和模型不变

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

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

甚至有时候,控制器中的操作包含基于返回不同视图(例如部分视图)的条件,这是jax调用吗

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

如何将其构建到我的MVC2项目中


干杯

我想到的一种方法是创建您自己的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);
        }
     }
}

+嗯,好主意。你有没有使用过这样的例子?我不想让它太过杀伤力…?只是一句警告的话-你想确保移动用户可以覆盖它,如果他们愿意,可以使用整个网站。@Kragen-是的,当然。它可能基于url值,而不是用户代理。@andy,我提供了一个应该有效的示例(虽然我不知道ipad的用户代理是什么!),但这不完全是生产代码!我完全同意克拉根的观点,仅仅依靠用户代理是完全不对的。