1

現在、モバイルで利用できるビューの一部を備えたデスクトップアプリケーションがあります。デスクトップバージョンとモバイルバージョンを切り替える機能を追加しました。ただし、ユーザーがモバイルバージョンを持たないページを表示していて、モバイルに切り替えると、多くの悪いことが起こります... MVC4に「申し訳ありませんが、これは実装されていません現在のビューのモバイルバージョンが存在しない場合は、「まだモバイル」ページですか?

ありがとう!

4

1 に答える 1

1

これが私がやったことです。対応するモバイルバージョンを持つすべてのViewメソッドを装飾するためにHasMobileVersion属性を作成しました。「申し訳ありません」ページを表示する代わりに、ユーザーをルート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をサイト「/」のルートとして強制します。モバイルページを持つすべてのビューを装飾するために邪魔にならないようにする必要がありますが、それはうまく機能します。

編集:

モバイル/デスクトップを切り替えるために、ViewSwitcherコントローラーがあります。_Layoutを使用している場合は、明らかにモバイルバージョンに切り替えます。_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のかみそりは次のとおりです。

@Url.Action("SwitchView", "ViewSwitcher" , new { mobile = true, returnUrl = ViewBag.HasMobileVersion != null && ViewBag.HasMobileVersion ? Request.Url.PathAndQuery : "/" })

モバイル側では、mobile=falseになります。

于 2012-10-10T15:08:14.423 に答える