【问题标题】:ASP.NET MVC 3/4- Multiple view single controllerASP.NET MVC 3/4-多视图单控制器
【发布时间】:2012-07-26 00:43:38
【问题描述】:

我正在开发一个 MVC 网站,该网站有两个单独的移动视图和 Web 视图。背景工作是一样的。所以我想为两个视图使用相同的控制器。

以下是文件夹结构。

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

    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.

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

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

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

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

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

【问题讨论】:

  • 为什么要为 mobileweb 使用不同的地址?

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


【解决方案1】:

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

【讨论】:

  • 嗨 Darin 我想要不同的 URL 而不是同一个 URL,它会根据设备检测视图。
  • 然后简单地调整 NuGet(它有完整的源代码可用),以便除了使用 User-Agent 请求标头之外,它还使用 url 来决定要呈现哪个视图。这应该很容易。
  • ok 会尝试不确定它是否会工作。我在 asp.net mvc 4 上尝试过,移动视图也在那里,但它不起作用。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我需要移动和网络的不同 url 是否可以使用视图切换器?
  • 另外我不想切换控制器,因为否则为什么我们应该三个独立的关注模型、控制器和视图。
【解决方案3】:

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

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

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

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

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

我们必须重写 TransformPath 方法,该方法将更改传递的 virtualPath for 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 将CustomDisplayMode 设置为DisplayModeProvider。我们可以设置ContextCondition 以便考虑url。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多