【发布时间】:2013-04-04 21:49:38
【问题描述】:
请对我温柔,这是我潜伏多年后在 StackOverflow 上的第一个问题。
我有一个 MVC4 站点已经启动并正在运行。我正在为使用标准 MVC 功能的网站添加移动支持:
如果没有“.Phone”版本的视图,我需要一些代码来允许框架使用 Layout.cshtml
示例 1
我有以下文件:
Views/Home/HasBoth.cshtml
Views/Home/HasBoth.Phone.cshtml
Views/Shared/Layout.cshtml
Views/Shared/Layout.Phone.cshtml
用桌面调用
- 呼叫 /Home/HasBoth
- 获取的框架不是移动设备
- 框架调用 Layout.cshtml
- 框架调用 HasBoth.cshtml
这太棒了。
手机调用
- 呼叫 /Home/HasBoth
- 框架选择是移动设备
- 框架调用 Layout.Phone.cshtml
- 框架调用 HasBoth.Phone.cshtml
再一次,这也很棒。
示例 2
我有以下文件:
Views/Home/HasNoPhone.cshtml
Views/Shared/Layout.cshtml
Views/Shared/Layout.Phone.cshtml
注意:没有 Views/Home/HasNoPhone.Phone.cshtml
用桌面调用
- 呼叫 /Home/HasNoPhone
- 获取的框架不是移动设备
- 框架调用 Layout.cshtml
- 框架调用 HasNoPhone.cshtml
这太棒了。
手机调用
- 呼叫 /Home/HasNoPhone
- 框架选择是移动设备
- 这里的代码可以解决没有 HasNoPhone.Phone.cshtml 视图
- 框架调用Layout.cshtml
- 框架调用 HasNoPhone.cshtml
以上是我想要实现的。
编辑
使用的解决方案
感谢 Zoka,我现在正在为其他希望做类似事情的人使用以下内容:
辅助方法:
/// <summary>
/// Looks to see if the view the exists.
/// </summary>
/// <param name="viewName">The view name.</param>
/// <param name="controllerContext">The controller context.</param>
/// <returns>True if the view exists.</returns>
public static bool ViewExists(string viewName, ControllerContext controllerContext)
{
ViewEngineResult result = ViewEngines.Engines.FindView(controllerContext, viewName, null);
return result.View != null;
}
_ViewStart.cshtml:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
// If a mobile viewing and no <view>.Phone.cshtml file is found set the override to desktop.
// This will ensure _Layout.Phone.cshtml and yyy.Phone.cshtml partials are not called.
string action = (string)ViewContext.Controller.ValueProvider.GetValue("action").RawValue;
string controller = (string)ViewContext.RouteData.Values["Controller"];
string viewPhoneName = "~/Views/" + controller + "/" + action + ".Phone.cshtml";
if (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice &&
MvcHelperAbove.ViewExists(viewPhoneName, ViewContext.Controller.ControllerContext) == false)
{
ViewContext.HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop);
}
}
_Layout.Phone.cshtml
...
@* Below is essential to allow css to work when going from Mobile to Desktop *@
<script>
$(document).ready(function () {
$.mobile.ajaxEnabled = false;
});
</script>
...
再次感谢大家。
【问题讨论】:
标签: c# asp.net-mvc layout asp.net-mvc-4 overriding