【问题标题】:Same Controller but Different views in mvc3mvc3中的相同控制器但不同的视图
【发布时间】:2012-07-19 18:07:23
【问题描述】:

我已经在 asp.net mvc3/c#/Razor 中创建了一个应用程序,现在我想为同一个应用程序实现新模板,并且我想使用相同的控制器逻辑,但视图会有所不同我将如何做到这一点? .例如:如果有人从阿联酋访问我的网站,我想要模板 A,但如果其他人在其他任何地方查看我的网站,我想向他展示我的模板 B。有没有办法在 asp.net mvc 3 中拥有相同的控制器但不同的视图

【问题讨论】:

  • 你的意思是layout会不一样吗?
  • 不仅布局所有视图也会改变

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


【解决方案1】:

有一个NuGet package 给你。在 ASP.NET MVC 4 中它是内置的。这个包测试用户代理以提供移动版本的视图。它为此实现了一个自定义视图引擎。它可以扩展,以便您使用 Request.UserHostAddress (IP) 代替使用用户代理,以便分派到正确的文件夹。就用户 IP 和国家/地区之间的映射而言,您必须自己实现或使用现有的公共 API。

【讨论】:

  • 自定义视图引擎的任何实现或教程?
  • 是的,那里有很多。只是谷歌。但我会简单地下载 NuGet 并查看它的源代码,然后简单地调整它以适应我的需求。
【解决方案2】:

您可以创建自定义视图引擎并覆盖调整路径的方法。

public class LocationAwareViewEngine: RazorViewEngine
{
   protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
   {
      // adjust the viewPath and masterPath
      return base.CreateView(controllerContext, viewPath, masterPath);
   }

   protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
   {
        // adjust the partialPath
        return base.CreatePartialView(controllerContext, partialPath);
   }

   protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
   {
      // adjust the virtualPath
      return base.FileExists(controllerContext, virtualPath);
   }
}

Global.asax.cs

ViewEngines.Engines.Add(new LocationAwareViewEngine());

【讨论】:

    【解决方案3】:

    我相信很简单。使用 _viewstart 页面和布局页面。在 _viewstart 页面中,编写条件逻辑以检查请求是否来自阿联酋并切换要使用的布局页面。

     If "this is uae request" then
    Layout = "layout1.vbhtml"
    else
    Layout = "layout2.vbhtml"
    End if
    

    【讨论】:

    • 老兄!我说我的所有视图不仅布局页面会有所不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多