当控制器操作包含视图路径

时间:2017-03-22 18:36:03

标签: c# asp.net-mvc razor asp.net-mvc-5.2 device-detection

我正在尝试在ASP.NET MVC应用程序中实现特定于设备的视图,如这里:  https://www.simple-talk.com/dotnet/asp-net/multiple-views-and-displaymode-providers-in-asp-net-mvc-4/  或者在这里:  https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/aspnet-mvc-4-mobile-features

虽然上面的文章是面向ASP.NET MVC4的,但它们的内容与框架的更高版本相关(我的应用程序使用的是ASP.NET MVC 5.2)。

我偶然发现了一个问题。我有以下控制器:

public class TestController: Controller
{
    public ActionResult Test()
    {
        return View(new TestModel());
    }
    public ActionResult Test2()
    {
        return View("~/Views/Test/Test.cshtml", new TestModel());
    }
}

测试模型非常基础:

public class TestModel
{
    public string TheDate
    {
        get
        {
            return DateTime.Now.ToString();
        }
    }
}

我在“〜/ Views / Test”文件夹中有两个视图:

Test.cshtml

@model MyNamespace.Models.TestModel
<!DOCTYPE html>
<html>
<head><title></title></head>
<body>
<h1>This is the desktop view</h1>
<p>model data: @Model.TheDate</p>
</body>
</html>

Test.Mobile.cshtml

@model MyNamespace.Models.TestModel
<!DOCTYPE html>
<html>
<head><title></title></head>
<body>
<h1>This is the mobile view</h1>
<p>model data: @Model.TheDate</p>
</body>
</html>

我已经实现了上面链接中描述的解决方案。

当要求/ test / test时,我得到了正确的视图(通过我的桌面浏览器请求Test.cshtml和从移动模拟器请求它时的Test.Mobile.cshtml)。但是,在询问/ test / test2时,我会一直得到桌面视图。

我已经搜索了我的问题的解决方案,但是每个人似乎一遍又一遍地重现相同的场景(即“/ test / test”场景)并且似乎没有人试图做“/ test / test2“场景。甚至可以覆盖该功能吗?我不会害怕覆盖默认的剃刀/ MVC功能,但我真的不知道从哪里开始。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我不确定是否会覆盖此功能,但您可以使用自定义 RazorViewEngine 类并覆盖FindView方法,并在其中使用 Request.Browser.IsMobileDevice检测移动设备作为这样的解决方法:

public class CustomViewEngine : RazorViewEngine
{
      public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
      {
           var viewPath = controllerContext.HttpContext.Request.Browser.IsMobileDevice ? "MobilePath" : "defaultPath";

           return base.FindView(controllerContext, viewPath, "MasterName", useCache);
      }
}

不要忘记在 Application_Start 中注册自定义视图引擎,如下所示:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine())