asp.net mvc 4显示模式和控制器

Tom*_*eck 3 asp.net-mvc-4

我一直在玩ASP.net MVC 4的新显示模式功能,你可以将.Mobile附加到显示页面(Index.Mobile.cshtml),它将为移动设备呈现移动版本.是否可以为不同的用户代理提供不同的控制器?像HomeController.Mobile.cs之类的东西?我试过这个,但它不起作用.编译器希望HomeController.cs和HomeController.Mobile.cs是局部的.

我知道我可以创建一个移动区域并将所有移动流量重定向到该区域,因此移动设备将拥有自己的控制器.但是,我更喜欢像HomeController.Mobile.cs这样的东西,因此它可以提供更清晰的代码库.否则,使用ASP.net 4的显示模式,移动版本和页面的Web版本将具有相同的控制器逻辑,并不总是需要.有关如何做到这一点的任何想法?

Kur*_*ler 6

文件名对于类没有任何意义,所以我不确定您对"HomeController.Mobile.cs"的想法是什么.你不能有两个同名的HomeController类,所以它可以是单独的控制器/区域/应用程序,也可以是共享的,如你所指出的那样.

如果您使用默认约定并具有相同的控制器,则可以根据设备类型分叉逻辑:

if (HttpContext.GetOverriddenBrowser().IsMobileDevice)
{
    //mobile specific logic
}
Run Code Online (Sandbox Code Playgroud)

如果您发现许多控制器/行动取决于设备类型,那么我要说的却是不同的逻辑,你有单独的应用程序,它确实是有意义的使用面积,甚至如果需要一个单独的Web应用程序,恕我直言.我试着根据这个来决定我走的路.

编辑以解决评论:

我明白你想要什么; 当我尝试制作jQuery Mobile版本的博客时,我不得不做类似的事情.基本上,我看到有3个选项:

  1. 具有一组逻辑的控制器,用于检索所有视图的所有数据.每个视图都使用它所需的内容.
  2. 具有"if(isMobile)"的控制器执行某些逻辑并在移动设备的情况下返回移动视图,并执行不同的逻辑并返回其他逻辑中的默认视图.
  3. 明确用于移动的完全独立的区域或应用程序(例如mobile.yourapp.com)

听起来你不想要#2或#3,所以你考虑过#1?移动设备的瓶颈在于它的资源和网络,所以如果你的服务器必须做"额外"的工作来获取移动视图永远不会呈现的一些数据,我就不会太担心.