ログイン時にアクションがヒットしたら、モバイル デバイス上にあるかどうかを確認し、モバイル デバイス上にある場合はモバイル ログイン ページにリダイレクトします。
private static string[] mobileDevices = new string[] {"iphone","ppc",
"windows ce","blackberry",
"opera mini","mobile","palm",
"portable","opera mobi" };
public static bool IsMobileDevice(string userAgent)
{
// TODO: null check
userAgent = userAgent.ToLower();
return mobileDevices.Any(x => userAgent.Contains(x));
}
次に、アクションで:
public ActionResult Index()
{
if (MobileHelper.IsMobileDevice(Request.UserAgent))
{
// Send to mobile route.
return RedirectToAction("Login", "MobileActivation");
}
// Otherwise do normal login
}
編集:
これをアプリケーション全体に広く適用したい場合は、次のようにすることができます。
次のように、どこにでも適用できる ActionFilter を作成します。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class RedirectToMobileArea : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var rd = filterContext.HttpContext.Request.RequestContext.RouteData;
var currentAction = rd.GetRequiredString("action");
var currentController = rd.GetRequiredString("controller");
string currentArea = rd.Values["area"] as string;
if (!currentArea.Equals("mobile", StringComparison.OrdinalIgnoreCase) && MobileHelper.IsMobileDevice(Request.UserAgent))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", currentController }, { "action", currentAction }, { "area", "mobile" } });
}
}
}
このフィルターは、モバイル (モバイル エリアにまだない) かどうかをチェックし、モバイル エリアの同じアクションとコントローラーに送信します。注同じ名前のコントローラーを使用する場合は、ルートをコントローラーの名前空間に登録する必要がありますこの回答を参照してください
次に、次のような各アクションにフィルターを適用できます。
[RedirectToMobileArea]
public ActionResult Index()
{
// do stuff.
}
または、どこでも実行したい場合は、すべてのコントローラーが継承する BaseController を作成し、それに適用します。
[RedirectToMobileArea]
public abstract class BaseController : Controller {
}
次に、それから継承します。
public HomeController : BaseController {
}
私はこれをテストしていませんが、うまくいくはずです...