更新: このソリューションには微妙なバグがあります。MVC フレームワークはFindView
/FindPartialView
を 2 回呼び出します。1 回は でuseCache=true
、それが結果を返さない場合は で 1 回useCache=false
です。すべてのタイプのビューに対してキャッシュが 1 つしかないため、デスクトップ ブラウザーが最初に登場した場合、モバイル ユーザーはデスクトップ ビューを見ることになる可能性があります。
この問題を解決するためにカスタム ビュー エンジンを使用することに興味がある人のために、Scott Hanselman はここで彼のソリューションを更新しました。
http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
(答えのハイジャックをお詫びします。他の誰かにこれを経験させたくないだけです!)
roufamatic 編集 (2010-11-17)
最初に行うことは、モバイル デバイス ブラウザー ファイルをプロジェクトに導入することです。このファイルを使用すると、デバイスがヘッダーで送信する内容の詳細を知らなくても、サポートしたいデバイスをターゲットにすることができます。このファイルはすでに作業を行っています。次に、Request.Browser プロパティを使用して、返すビューを調整します。
次に、Views フォルダーの下でビューをどのように整理するかについて戦略を立てます。私は、デスクトップ バージョンをルートに残してから、Mobile フォルダを作成することを好みます。たとえば、ホーム ビュー フォルダは次のようになります。
カスタムビューエンジンの使用について@Mehrdadに同意する必要があります。ビュー エンジンは複数の目的を果たしますが、その目的の 1 つはコントローラーのビューを見つけることです。これを行うには、FindView メソッドをオーバーライドします。このメソッドでは、ビューの場所を確認できます。サイトを使用しているデバイスがわかったら、ビューを整理するために思いついた戦略を使用して、そのデバイスのビューを返すことができます。
public class CustomViewEngine : WebFormViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
// Logic for finding views in your project using your strategy for organizing your views under the Views folder.
ViewEngineResult result = null;
var request = controllerContext.HttpContext.Request;
// iPhone Detection
if (request.UserAgent.IndexOf("iPhone",
StringComparison.OrdinalIgnoreCase) > 0)
{
result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
}
// Blackberry Detection
if (request.UserAgent.IndexOf("BlackBerry",
StringComparison.OrdinalIgnoreCase) > 0)
{
result = base.FindView(controllerContext, "Mobile/BlackBerry/" + viewName, masterName, useCache);
}
// Default Mobile
if (request.Browser.IsMobileDevice)
{
result = base.FindView(controllerContext, "Mobile/" + viewName, masterName, useCache);
}
// Desktop
if (result == null || result.View == null)
{
result = base.FindView(controllerContext, viewName, masterName, useCache);
}
return result;
}
}
上記のコードを使用すると、戦略に基づいてビューを設定できます。デバイスのビューが見つからない場合、またはデフォルトのモバイル ビューがない場合は、フォール バックはデスクトップ ビューです。
ビューエンジンを作成する代わりに、コントローラーにロジックを配置することにした場合。最良の方法は、コントローラーを装飾できるカスタムActionFilterAttributeを作成することです。次に、OnActionExecutedメソッドをオーバーライドして、サイトを表示しているデバイスを特定します。方法については、このブログ投稿をご覧ください。この投稿には、まさにこのテーマに関するいくつかの Mix ビデオへの素敵なリンクもあります。