【问题标题】:asp.net mvc 4 display modes and controllerasp.net mvc 4 显示模式和控制器
【发布时间】:2012-03-30 16:42:41
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    文件名对类没有任何意义,所以我不确定您对“HomeController.Mobile.cs”的想法有何设想。正如您所指出的,您不能拥有两个同名的 HomeController 类,因此它要么是单独的控制器/区域/应用程序,要么是共享的。

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

    if (HttpContext.GetOverriddenBrowser().IsMobileDevice)
    {
        //mobile specific logic
    }
    

    如果您发现许多控制器/动作根据设备类型具有不同的逻辑,那么我认为您有单独的应用程序,并且它确实有意义恕我直言,如果需要,一个区域甚至一个单独的 Web 应用程序。我会试着根据这个决定我走的路。

    编辑以解决 cmets:

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

    1. 具有一组逻辑的控制器,用于检索所有视图的所有数据。每个视图只使用它需要的东西。
    2. 带有“if(isMobile)”的控制器在移动设备的情况下执行某些逻辑并返回移动视图,在其他情况下执行不同的逻辑并返回默认视图。
    3. 完全独立的区域或专门针对移动设备的应用程序(例如 mobile.yourapp.com)

    听起来你不想要#2 或#3,那么你考虑过#1 吗?移动设备的瓶颈在于其资源和网络,因此如果您的服务器必须执行“额外”工作来获取移动视图从未呈现的某些数据集,我不会太担心。

    【讨论】:

    • 移动设备不同于网页。最值得注意的是屏幕的实际大小。我在想,对于任何给定的请求,如果是网页,那么我可以提供更多的内容来填充屏幕空间,然后我可以为移动设备做些什么。 MVC 4 为基于用户代理切换视图提供了一些很棒的功能。我可以基于不同的界面有不同的视图,但是,我坚持使用相同的控制器来为不同的视图收集不同的数据集。我不想在控制器中出现“if(isMobileDevice)”。还有其他选择吗?
    • 抱歉,第一个评论中的字符不足...无论如何,对于给定的请求,我想根据用户代理提供不同的数据(即不同的界面)。我怎样才能在控制器中有效地做到这一点?
    • 如果您需要不同设备的不同数据,那么我认为它们不应该共享相同的视图。最好的方法是在不同区域使用单独的控制器。
    • 非常感谢您的想法。这有很大帮助。我没有想到选项#1。我认为这可能是最好的方法。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2012-07-05
    相关资源
    最近更新 更多