Asp.net mvc ASP.NET MVC使用相同的控制器分离移动视图

Asp.net mvc ASP.NET MVC使用相同的控制器分离移动视图,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在使用ASP.NET MVC 3 w/Razor开发一个新项目,并开发同一站点的两个不同视图,一个完整版本和一个移动版本。使用相同控制器但基于用户代理显示不同视图的最佳实践/方法是什么?我应该在控制器中处理这个问题吗?在每个控制器操作中都有if语句检查用户代理,然后根据其设备返回不同的视图,这似乎是一件麻烦、冗余、容易出错的事情。现在可以使用ASP.NET MVC(从第4版起)的内置功能,名为“” 默认情况下,ASP.NET MVC附带两种内置显示模式。有默认的显示模式,可以像往常一样呈现“

我正在使用ASP.NET MVC 3 w/Razor开发一个新项目,并开发同一站点的两个不同视图,一个完整版本和一个移动版本。使用相同控制器但基于用户代理显示不同视图的最佳实践/方法是什么?我应该在控制器中处理这个问题吗?在每个控制器操作中都有if语句检查用户代理,然后根据其设备返回不同的视图,这似乎是一件麻烦、冗余、容易出错的事情。

现在可以使用ASP.NET MVC(从第4版起)的内置功能,名为“”

默认情况下,ASP.NET MVC附带两种内置显示模式。有默认的显示模式,可以像往常一样呈现“标准”视图,还有一种通用的“移动”显示模式

这是通过检测客户端设备是否是移动浏览器来实现的(这本身是通过嗅探客户端设备的状态来确定的,因此不是100%可靠)。如果设备被确定为移动设备,则会覆盖发送到客户端的实际MVC视图,并呈现和发送替代视图。在包含移动显示模式的情况下,它被配置为查找后缀为
.mobile.cshtml
的视图,而不是
.cshtml
(如下面的屏幕截图所示)

这允许您设计完全不同的视图,这些视图将发送到移动设备和非移动设备,而不需要对控制器逻辑进行任何更改,因此您不需要在其中包含任何条件逻辑

如果您需要对发送到客户端设备的确切视图进行更精细的控制,则整个显示模式功能是可配置和可扩展的。您可以定义自己的显示模式(通常在应用程序启动时执行),这些模式可以特定于给定的浏览器、给定的设备或任何您希望的任意定义。所有这些都基于来自客户端设备的用户代理字符串

考虑下面的代码片段,其中显示了在应用程序启动方法中为Windows Phone、iPhone和Android添加3种额外的自定义显示模式:

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和一个字符串,以便与用户代理字符串匹配,以确定是否要使用此显示模式。如果是,则将查找具有相同字符串后缀的视图。(也就是说,对于上面的iPhone显示模式,我们希望在用户代理字符串中的任何位置都能找到字符串“iPhone”,如果它存在,我们将使用此显示模式,以
iPhone.cshtml
后缀而不是
.cshtml
后缀呈现视图

您可以在此处阅读有关此功能的更多信息:
特别是在标题为“覆盖视图、布局和局部视图”和“浏览器特定视图”的章节中.

我想值得一提的是,这是为MVC 4计划的。请将asnwer标记为正确的。感谢您的回答!根据您的回答,我想在代码隐藏中而不是在
视图中构建不同图像的路径。是否可以在控制器中以某种方式实现?