0

我正在尝试在 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”文件夹中有两个视图:

测试.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 功能弄脏我的手,但我真的不知道从哪里开始。

任何帮助表示赞赏。

4

1 回答 1

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())
于 2017-03-23T12:09:47.143 回答