ASP.NET MVC 3 / 4-多视图单控制器

时间:2012-07-25 11:35:32

标签: asp.net-mvc asp.net-mvc-3 razor

我正在开发一个MVC网站,它有两个独立的移动和网络视图。背景工作是一样的。所以我希望两个视图都有相同的控制器。

以下是该文件夹的结构。

查看 - >视图文件夹。

    Customer -> This folder is for web

                 Index.cshtml  -> Customer listing view for web

    MobileCustomer-> This folder is for mobile 

                 Index. cshtml -> Customer listing view for mobile.

现在,移动设备和网络用户界面的背景都是相同的,这是不同的。所以我想为此使用相同的客户控制器。所以在asp.net mvc项目的Controller文件夹中。我有客户控制器,我想使用它。

但我希望每个手机的网址都不同。

localhost / customer / - >这将加载客户的正常视图

localhost / mobile / customer - >这将为客户加载移动视图

如何使用asp.net mvc 3或4应用程序实现这一目标?

3 个答案:

答案 0 :(得分:1)

ScottHa在博客中发表了一篇关于custom view engine的博文,您可以使用该{{3}}将您的移动视图与桌面客户端视图分开,并根据用户代理为其中一个提供服务。 NuGet与ASP.NET MVC 4中的内置功能规范兼容,因此迁移将更加容易。因此,如果您正在使用ASP.NET MVC 3,请下载MobileViewEngines NuGet并开始使用它。如果您使用的是ASp.NET MVC4,那么它已经内置了。

答案 1 :(得分:0)

跟进达林的回应。 ASP.NET MVC4内置了一个基于MobileViewEngines的“View Switcher”。

遗漏的一个重要细节是这些视图切换器在决定基于用户代理之前首先检查是否存在cookie或某些其他变量(如子域(视图首选项))。这样,移动设备上的某人可以切换到桌面视图,反之亦然。

视图切换器被连接到ViewEngine中,因此当您的客户控制器具有呈现Index.cshtml视图的Index操作时,您可以设置规则,以便对于移动设备,它将呈现Index.mobile。 cshtml视图。您可以通过使用专用视图的设置创建自定义后缀。 Index.iphone.cshtml用于呈现特定于移动设备的视图。

基本上,使用MVC4中存在的新机制,您的控制器及其操作将正常运行,而视图引擎将呈现不同的视图。如果你想在你的场景中做一些事情,我建议你将MobileCustomer控制器拆分成一个区域 - >移动(区) - > CustomerController->等

答案 2 :(得分:0)

我一直在浏览ASP.NET MVC 4的源代码,并找到了一些可能对您有所帮助的有趣内容。 这只是我的想法,我没有测试过这个!

我们必须从内置功能中自定义几件事。

  1. 从单独的文件夹中查找移动视图。

  2. 只有当网址包含 mobile 时,才能呈现移动版。

  3. 我们必须扩展DefaultDisplayMode类,以便从我们的自定义文件夹中选择移动视图。 DefaultDisplayMode位于System.Web.WebPages汇编中。 TransformPath方法的基础实现将virtualPath/Views/Home/Index.cshtml转换为/Views/Home/Index.Mobile.cshtml

    我们必须覆盖将更改传递的TransformPath的{​​{1}}方法。从virtualPath/Views/Home/Index.cshtml

    /Views/MobileHome/Index.cshtml

    我们必须从public class CustomDisplayMode: DefaultDisplayMode { // ... protected override string TransformPath(string virtualPath, string suffix) { if (String.IsNullOrEmpty(suffix)) { return virtualPath; } // TO DO: modify the virtual path // for ex. from /Views/Home/Index.cshtml to /Views/MobileHome/Index.cshtml return virtualPath; } } _开始将CustomDisplayMode设置为DisplayModeProvider。我们可以设置Application以便考虑网址。

    ContextCondition