2

ルーティング構成を尊重して、アクションがプラットフォームごとに異なるビューを返すようにしようとしています。カスタムViewResultを作成する場合、FindViewメソッドをオーバーライドしますか?もしそうなら、どうすれば自動的に見つかるビューを変更できますか?

例:HomeController.Aboutアクションは、コンピューターにView \ Home \ About.cshtml、タブレットにView \ Home \ AboutTablet.cshtml、携帯電話にView \ Home\AboutMobile.cshtmlを表示します。

4

5 に答える 5

2

あなたのためのNuGetがあります:MobileViewEngines。ScottHaはブログ投稿でそれをカバーしました。この機能が組み込まれているため、ASP.NETMVC4と互換性のある仕様で簡単に削除できます。

于 2012-07-26T06:56:06.187 に答える
2

次のように Actionfilter を定義できます。

public class SetDeviceDependantView : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // Only works on ViewResults...
        ViewResultBase viewResult = filterContext.Result as ViewResultBase;
        if (viewResult != null)
        {
            if (filterContext == null)
                throw new ArgumentNullException("context");

            // Default the viewname to the action name
            if (String.IsNullOrEmpty(viewResult.ViewName))
                viewResult.ViewName = filterContext.RouteData.GetRequiredString("action");

            // Add suffix according to device type
            if (IsTablet(filterContext.HttpContext))
                viewResult.ViewName += "Tablet";
            else if (IsMobile(filterContext.HttpContext))
                viewResult.ViewName += "Mobile";
        }
        base.OnResultExecuting(filterContext);
    }

    private static bool IsMobile(HttpContextBase httpContext)
    {
        return httpContext.Request.Browser.IsMobileDevice;
    }

    private static bool IsTablet(HttpContextBase httpContext)
    {
        // this requires the 51degrees "Device Data" package: http://51degrees.mobi/Products/DeviceData/PropertyDictionary.aspx
        var isTablet = httpContext.Request.Browser["IsTablet"];
        return isTablet != null && isTablet.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase);
    }
}

次に、必要なアクション/コントローラーに次のように注釈を付けることができます。

[SetDeviceDependantView]
public ActionResult About()
{
    return View();
}

または、global.asax でグローバルに設定します。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new SetDeviceDependantView());
}

ここではタブレットを検出するために 51degrees ライブラリに依存していることに注意してください。別の手法の使用を検討することもできます。ただし、それは別のトピックです。

于 2012-07-29T14:03:18.260 に答える
0

カスタム ViewEngine を構築することは、この要件に対して MVC3 で推奨されるアプローチです。参考までに-MVC4はこの機能をすぐにサポートします。

デバイス固有のビューの詳細については、同様の回答が StackOverflow 自体に投稿されています https://stackoverflow.com/a/1387555/125651

于 2012-07-26T06:51:05.633 に答える
0

独自のものを作成しViewEngine(おそらく使用しているものから派生させます)、オーバーライドする必要がありますFindViewand FindPartialView. フォールバックを提供できます (つまり、タブレットが見つからない場合は汎用ビューを使用します)。

ほとんどの問題は、異なる「モード」を区別するための基準を定義することです。

于 2012-07-24T15:09:52.827 に答える
0

これを MVC4 より前に実行したい場合は、Christopher Bennage によるこのブログ投稿を確認してください。

http://dev.bennage.com/blog/2012/04/27/render-action/

私は ContentTypeAwareResult クラスに特に興味がありました。これは、あなたが探しているもののようです。

https://github.com/liike/reference-application/blob/master/MileageStats.Web/ContentTypeAwareResult.cs

于 2012-07-16T20:59:54.043 に答える