如果桌面版没有移动视图,则显示通用移动页面

时间:2012-10-03 19:22:08

标签: asp.net mobile asp.net-mvc-4

目前,我有一个桌面应用程序,它的一些视图可用于Mobile。我添加了在桌面版和移动版之间切换的功能。但是,如果用户位于没有移动版本并切换到移动版的页面上,则会发生一系列不良事件......是否有某种方法可以告诉MVC4转到"抱歉,这不是&# 39; t在Mobile上实现了#34;页面如果当前视图的移动版本不存在?

谢谢!

1 个答案:

答案 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。