2012-07-25 73 views
0

我正在MVC网站上有两个单独的视图的移动和网页。后台工作是一样的。所以我想要有两个视图相同的控制器。ASP.NET MVC 3/4-多视图单控制器

以下是该文件夹的结构。

查看 - >用于查看的文件夹。

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. 

现在背景的东西都是相同的两个用户界面都为手机和网络是diffrerent。所以我想为此使用相同的客户控制器。所以在asp.net mvc项目的Controller文件夹中。我有客户控制器,我想使用它。

但我希望每个手机的URL都不一样。

本地主机/客户/ - >这将加载普通视图为客户

本地主机/移动/客户 - >这将加载移动视图为客户

我怎么可以用asp.net的MVC 3实现这一目标或4申请?

+0

为什么你需要* mobile *和* web *的不同地址? – VJAI 2012-07-25 13:58:02

回答

1

ScottHa在博客中关于custom view engine的博客,您可以使用它将您的移动视图与桌面客户端视图分开,并基于用户代理服务于其中一个或另一个。 NuGet与ASP.NET MVC 4中的内置功能兼容,因此迁移对您来说更容易。因此,如果您使用的是ASP.NET MVC 3,请继续下载MobileViewEngines NuGet并开始使用它。如果你使用的是ASp.NET MVC4,那么这已经是你内置的了。

+0

嗨达林我想要不同的网址不是相同的URL和基于设备,它会检测到的观点。 – 2012-07-25 11:42:08

+0

然后,只需调整NuGet(它具有完整的源代码可用),以便除了使用User-Agent请求标头之外,还可以在决定渲染哪个视图时使用url。它应该非常简单。 – 2012-07-25 11:44:40

+0

好吧,会尝试不确定它的工作与否。我在asp.net mvc 4上尝试过,其中移动视图也存在,但不起作用。 – 2012-07-25 12:48:05

0

在跟进Darin的回应。 ASP.NET MVC4内置了一个基于MobileViewEngines的“视图切换器”。

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

视图切换器挂钩到ViewEngine中,以便当您有一个带有索引操作的客户控制器并呈现Index.cshtml视图时,您可能会设置规则,以便移动设备将呈现Index.mobile .cshtml视图。您可以通过使用专用视图ex的设置来创建自定义后缀。 Index.iphone.cshtml来呈现移动设备特定的视图。因此,基本上,使用MVC4中存在的新机制,您的控制器及其操作将正常工作,而视图引擎将呈现不同的视图。如果你想在你的场景中做类似的事情,我建议你将MobileCustomer控制器分割成一个区域 - > Mobile(Area) - > CustomerController->等。

+0

我需要不同的手机和网络的URL是可能的视图切换器? – 2012-07-25 13:58:57

+0

另外我不想切换控制器,因为其他明智的原因我们应该三个单独的关注模型,控制器和视图。 – 2012-07-25 13:59:41

0

我一直在浏览源代码ASP.NET MVC 4,并发现一些有趣的事情,可能会帮助你。 这只是我的想法,我还没有测试过!

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

  1. 查找来自不同文件夹的移动视图。

  2. 只有当url包含移动时,才能呈现移动版本。

我们必须扩展DefaultDisplayMode类,以从我们的自定义文件夹中选择移动视图。 DefaultDisplayModeSystem.Web.WebPages程序集中。 TransformPath方法的基本实现将virtualPath/Views/Home/Index.cshtml转换为/Views/Home/Index.Mobile.cshtml

我们必须重写TransformPath方法,该方法会将通过的virtualPath更改为ex。从/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; 
    } 
} 

我们必须从Application _Start设置我们CustomDisplayModeDisplayModeProvider。我们可以设置ContextCondition,以便考虑URL。

DisplayModeProvider.Instance.Modes.Insert(0, new CustomDefaultDisplayMode("Mobile") 
{ 
    ContextCondition = (context => context.GetOverriddenBrowser().IsMobileDevice 
         && check context.Request.Url contains the Mobile segment) 
});