我正在尝试在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功能,但我真的不知道从哪里开始。
感谢任何帮助。
答案 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())