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