我正在使用ASP.NET MVC 3 w/Razor并开发2个不同视图的同一站点,完整版本和移动版本的新项目。使用相同控制器的最佳实践/方法是什么?但是基于用户代理显示不同的视图?我应该在控制器中处理这个问题吗?看起来,如果每个控制器中的语句检查用户代理,然后根据其设备返回不同的视图,这似乎很麻烦,多余,容易出错。ASP.NET MVC使用相同的控制器分离移动视图
回答
这现在可以使用来实现内置的(从版本4起)被称为“DisplayModes”
默认情况下,ASP.NET MVC附带两种显示模式内置ASP.NET MVC的功能。这里有默认的显示模式,它像往常一样渲染你的“标准”视图,还有一个通用的“移动”显示模式。
这可以通过检测客户端设备是否为移动浏览器(其本身是通过嗅探客户端设备的User-Agent string从而不是100%可靠)来工作的。如果设备被确定为移动设备,则发送给客户端的实际MVC视图将被覆盖,并替代地呈现并发送替代视图。在所包括的移动显示模式的情况下,它的配置为查找与.mobile.cshtml
后缀一个视图而不是.cshtml
(如在下面的屏幕截图示出)
这样就可以设计出完全不同的观点这将被发送到移动设备而非移动设备,而不需要对您的控制器逻辑进行任何更改,因此您不需要在其中包含任何条件逻辑。
如果您需要更精确地控制发送到客户端设备的精确视图,则整个显示模式功能是可配置和可扩展的。您可以定义您自己的显示模式(通常在应用程序启动时执行),这些模式可以是特定的浏览器,给定设备或您希望的任意定义。所有都基于来自客户端设备的用户代理字符串。
考虑下面的代码片断下面示出在应用程序启动方法加入3种附加的定制显示模式为Windows电话,iPhone和Android:
protected void Application_Start()
{
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("WP")
{
ContextCondition = (context => context.GetOverriddenUserAgent().
IndexOf("Windows Phone OS",StringComparison.OrdinalIgnoreCase) >= 0)
});
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone")
{
ContextCondition = (context => context.GetOverriddenUserAgent().
IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
});
DisplayModeProvider.Instance.Modes.Insert(2, new DefaultDisplayMode("Android")
{
ContextCondition = (context => context.GetOverriddenUserAgent().
IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0)
});
}
每个显示模式被赋予一个ID和一个串到匹配用户代理字符串以确定是否使用此显示模式。如果是,则DisplayModeProvider将查找具有相同字符串后缀的View。 (例如,对于上面的iPhone显示模式,我们希望在用户代理字符串中的任何位置找到字符串“iPhone”,如果存在,我们使用此显示模式,以iphone.cshtml
后缀呈现视图,而不是.cshtml
后缀
你可以阅读更多有关此功能在这里:在部分 http://www.asp.net/mvc/overview/older-versions/aspnet-mvc-4-mobile-features 专门为首的“重写次数,布局和局部视图”和“浏览器的具体意见”
谢谢grea回答!基于你的回答,我想在后面的代码中构建不同图像的路径,而不是在“视图”中。某种程度上可以在控制器中执行吗? –
- 1. 部分视图控制器ASP.NET MVC
- 2. 视图控制器分离
- 3. 在MVC中使用相同的控制器多视图3
- 4. 在ASP.Net的相同视图中分离两个表单MVC
- 5. 重用ASP.NET MVC视图和控制器
- 6. MVC:为什么模型,视图和控制器的分离?
- 7. 从MVC控制器返回数据返回相同的视图
- 8. ASP.NET MVC动态路由与默认控制器/动作相同
- 9. ASP.NET MVC 2.0:共享视图控制器
- 10. asp.net mvc - 视图和控制器
- 11. ASP.Net MVC控制器和视图交互
- 12. 控制器和视图在MVC中应该如何分离?
- 13. 相同视图的ASP.NET MVC部分视图
- 14. 如何使用视图和控制器显示图像ASP.NET MVC
- 15. 从一个控制器视图到另一个控制器视图的ASP.NET MVC 3 Razor渲染部分视图
- 16. 分割ASP.NET MVC控制器
- 17. MonoTouch和MVC - 钩子2视图到相同的控制器
- 18. ASP.NET MVC 3 - 使控制器中的视图选择通用
- 19. ASP.NET MVC - 设置主视图相应地与控制器
- 20. 从不同的视图控制器打开相同的视图
- 21. ASP.NET MVC:控制控制器/视图的命名约定?
- 22. ASP.NET MVC - 将控制器和相关视图放在同一个文件夹中?
- 23. 使用多个控制器在同一视图与离子
- 24. 在视图和控制器使用ASP.NET
- 25. asp.net MVC部分视图控制器操作
- 26. ASP.NET MVC - 部分视图可以有控制器吗?
- 27. ASP.NET MVC 3控制器部分视图操作
- 28. 使用不同母版页的相同视图 - ASP.NET MVC
- 29. Asp.Net Mvc - 如何在共享视图中使用“控制器”
- 30. ASP.Net MVC:在不同控制器中的相同操作名称
我想这是值得一提,这是*计划*对于MVC 4 http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap –
请将asnwer标记为正确的。 –