具有精确视图名称的ASP.NET MVC 4移动显示模式

时间:2012-03-09 03:01:59

标签: mobile asp.net-mvc-4

我已将应用程序启动事件中的显示模式设置为

DisplayModeProvider.Instance.Modes.Insert( 0, new DefaultDisplayMode( "iPhone" ){
ContextCondition = ( context => 
    context.GetOverriddenUserAgent( ).IndexOf( 
        "iPhone", 
        StringComparison.OrdinalIgnoreCase ) >= 0 ) } );

然后在控制器中我返回View我在哪里指定视图名称:

  

返回视图(“〜/ Views / Common / User / Login.cshtml”,viewModel);

如果我从iPhone访问该页面,它将直接进入登录视图

如果我没有指定视图名称:

return View( viewModel );

在这种情况下,从iPhone我看到Login.iPhone.cshtml

问题:是否可以指定视图的名称,但是DisplayModeProvider如何选择cshtml文件的常规或iPhone版本?

1 个答案:

答案 0 :(得分:0)

我通常不喜欢复活旧问题,但由于这个问题从未得到解答,而且这是我在寻找自己答案方面遇到特别困难的问题,对于遇到同样问题的其他人来说,可能值得给出答案。

您可以将其他位置添加到您正在使用的ViewEngine的ViewLocationFormats和PartialViewLocationFormats集合中。这样你就可以像tvanfosson建议的那样指定视图名称,MVC会正确地找到文件,这应该允许移动覆盖工作它的神奇。

以下是我用来覆盖PartialViewLocationFormats的一些代码,您也可以使用ViewLocationFormats执行相同的操作。这是作为application_start

的一部分添加到global.asax中的
            ViewEngines.Engines.Clear();
            var razorViewEngine = new RazorViewEngine
            {
                PartialViewLocationFormats = new[]
                {
                    "~/Views/{1}/{0}.cshtml",
                    "~/Views/Shared/{0}.cshtml",
                    "~/Views/{1}/EditorTemplates/{0}.cshtml",
                    "~/Views/{1}/DisplayTemplates/{0}.cshtml",
                    "~/Views/Shared/DisplayTemplates/{0}.cshtml"
                }
            };

由于此方法涉及清除viewengines集合,因此您需要为所有正在使用的视图引擎添加所有locationFormats,甚至是标准格式。

相关问题