0

我正在开发一个 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.

现在,移动设备和 Web 的 UI 上的背景是相同的,但它们是不同的。所以我想为此使用相同的客户控制器。所以在asp.net mvc项目的Controller文件夹中。我有客户控制器,我想使用它。

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

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

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

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

4

3 回答 3

1

ScottHa 在博客中介绍了一种自定义视图引擎,您可以使用该引擎将移动视图与桌面客户端视图分开,并基于用户代理为两者提供服务。NuGet 与 ASP.NET MVC 4 中的内置功能规范兼容,因此迁移对您来说会更容易。因此,如果您使用的是 ASP.NET MVC 3,请继续下载MobileViewEnginesNuGet 并开始使用它。如果您使用的是 ASp.NET MVC4,那么它已经为您内置了。

于 2012-07-25T11:38:26.897 回答
0

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

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

视图切换器与 ViewEngine 挂钩,因此当您有一个带有 Index 操作的客户控制器时,您可以设置规则,以便为移动设备呈现 Index.mobile.cshtml 视图。您可以通过使用专用视图的设置来创建自定义后缀。Index.iphone.cshtml 呈现移动设备特定的视图。

因此,本质上,使用 MVC4 中存在的新机制,您的控制器及其操作将正常运行,而视图引擎将呈现不同的视图。如果您想在您的场景中执行类似的操作,我建议您将 MobileCustomer 控制器拆分为一个区域 -> Mobile(Area)->CustomerController-> 等。

于 2012-07-25T13:42:47.420 回答
0

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

我们必须从内置功能中定制一些东西。

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

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

我们必须扩展DefaultDisplayMode该类以从我们的自定义文件夹中选择移动视图。DefaultDisplayMode正在System.Web.WebPages组装中。该TransformPath方法的基本实现将virtualPathfrom转换/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;
    }
}

我们必须从_Start设置我们的CustomDisplayModeto 。我们可以设置这样的,以考虑 url。DisplayModeProviderApplicationContextCondition

DisplayModeProvider.Instance.Modes.Insert(0, new CustomDefaultDisplayMode("Mobile")
{
    ContextCondition = (context => context.GetOverriddenBrowser().IsMobileDevice 
                         && check context.Request.Url contains the Mobile segment)
});
于 2012-07-25T14:52:05.710 回答