Visual studio 2010 什么';这是处理asp.net mvc 2应用程序移动版本的最佳实践方法
MVC的美妙之处在于关注点的分离,特别是来自Asp.net webforms世界的关注点 我现在有了一个带有控制器、动作、模型和视图的MVC站点 看看我的网站,我可以看到,要为它的移动版本服务,我所要做的就是调出它的视图部分,保持控制器、动作和模型不变 但是,这种“交换”的最佳方法是什么,特别是在Asp.net MVC 2中 不可避免地,控制器和视图之间存在一些耦合。例如,某些操作反映视图的名称,因此按约定进行连接。有时,在返回模型时会显式定义视图 甚至有时候,控制器中的操作包含基于返回不同视图(例如部分视图)的条件,这是jax调用吗 所以,考虑到这一点,说我对目前的网站很满意,但现在我想创建一个iPad版的网站。因此,它包含用于触摸事件的特殊js库,视图可能不那么冗长,当然CSS也不同 如何将其构建到我的MVC2项目中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中 不可避免地,控制器和视图之间存在一些耦合。例如,某些操作反映视图的名称,因此按约定进行连接。有时,在返回模型时会显式定义视图 甚至有时候,控制器中的操作包含基于返回不同视图
干杯我想到的一种方法是创建您自己的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的用户代理是什么!),但这不完全是生产代码!我完全同意克拉根的观点,仅仅依靠用户代理是完全不对的。