目前,我有一个桌面应用程序,它的一些视图可用于Mobile。我添加了在桌面版和移动版之间切换的功能。但是,如果用户位于没有移动版本并切换到移动版的页面上,则会发生一系列不良事件......是否有某种方法可以告诉MVC4转到"抱歉,这不是&# 39; t在Mobile上实现了#34;页面如果当前视图的移动版本不存在?
谢谢!
答案 0 :(得分:1)
这就是我最终要做的事情。我创建了一个HasMobileVersion属性来装饰具有相应移动版本的所有View方法。我只是将用户重定向到根URL(移动版必须存在),而不是显示“抱歉”页面。这是代码:
/// <summary>
/// This attribute specifies which views have Mobile versions available.
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class HasMobileVersionAttribute : ActionFilterAttribute
{
#region << Constructors >>
/// <summary>
/// Default constructor.
/// </summary>
public HasMobileVersionAttribute()
{
// Nothing to do
}
#endregion
#region << Overridden Methods >>
/// <summary>
/// Allows a View to switch between mobile and desktop versions, ensuring that if a page does not have a mobile version that
/// it sends the user to the root page.
/// </summary>
/// <param name="ac">Request data.</param>
public override void OnActionExecuting(ActionExecutingContext ac)
{
ac.Controller.ViewBag.HasMobileVersion = true;
}
#endregion
}
我们声明了一个链接(好吧,图标),允许用户在移动设备和桌面之间切换。此链接将从ViewBag检查HasMobileVersion == true。如果是,则一旦用户处于移动模式,它将使用当前URL作为返回URL。如果这不存在,那么我们强制返回URL,Mobile链接将用作网站“/”的根目录。你必须不遗余力地装饰所有拥有移动页面的视图,但它运行良好。
编辑:
要在Mobile / Desktop之间切换,我们有一个ViewSwitcher控制器。如果您在_Layout中,显然您将切换到Mobile版本。如果你在_Layout.Mobile,你会去桌面。该属性仅用于确定当前页面是否具有可供查看的移动版本。在移动端,桌面版本始终存在(否则,您也必须制作HasDesktopVersion属性)。这是代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.WebPages;
using System.Web.Mvc;
public class ViewSwitcherController : Controller
{
#region << Views >>
/// <summary>
/// Allows the user to swicth between mobile and desktop versions of the site.
/// </summary>
/// <param name="mobile">True if the user should view the mobile version; false if the user should view the desktop version.</param>
/// <param name="returnUrl">Original URL.</param>
/// <returns>RedirectResult to original URL.</returns>
public RedirectResult SwitchView(bool mobile, string returnUrl)
{
if (Request.Browser.IsMobileDevice == mobile)
HttpContext.ClearOverriddenBrowser();
else
HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);
return Redirect(returnUrl);
}
#endregion
}
以下是获取谈论结果的URL的Razor:
@Url.Action("SwitchView", "ViewSwitcher" , new { mobile = true, returnUrl = ViewBag.HasMobileVersion != null && ViewBag.HasMobileVersion ? Request.Url.PathAndQuery : "/" })
在移动端,移动设备= false。