0

I am working on a MVC site which are having two separate views for mobile and web. The background work is same. So I want to have same controller for both view.

Following is folder structure for that.

View -> Folder for view.

    Customer -> This folder is for web

                 Index.cshtml  -> Customer listing view for web

    MobileCustomer-> This folder is for mobile 

                 Index. cshtml -> Customer listing view for mobile.

Now the back ground things are same for both on the UI for both mobile and web are diffrerent. So I want to use same customer controller for that. So in Controller folder of asp.net mvc project. I have customer controller and I want to use that same.

But I want URL for each mobile are different.

localhost/customer/ -> This will load normal view for customer

localhost/mobile/customer -> This will load mobile view for customer

How I can achieve this with asp.net mvc 3 or 4 application?

4

3 に答える 3

1

ScottHa は、モバイル ビューをデスクトップ クライアント ビューから分離し、ユーザー エージェントに基づいてどちらか一方を提供するために使用できるカスタム ビュー エンジンについてブログに書いています。NuGet は、ASP.NET MVC 4 の組み込み機能と仕様互換性があるため、移行が容易になります。したがって、ASP.NET MVC 3 を使用している場合は、MobileViewEnginesNuGet をダウンロードして試してみてください。ASP.NET MVC4 を使用している場合、それは既に組み込まれています。

于 2012-07-25T11:38:26.897 に答える
0

のソース コードを調べてみたASP.NET MVC 4ところ、役に立つかもしれない興味深いことがいくつか見つかりました。これは私のアイデアであり、テストしていません。

組み込み機能からいくつかのことをカスタマイズする必要があります。

  1. 別のフォルダーからモバイル ビューを検索します。

  2. URL にmobileが含まれている場合にのみ、モバイル バージョンをレンダリングする必要があります。

DefaultDisplayModeカスタム フォルダーからモバイル ビューを選択するには、クラスを拡張する必要があります。は組み立てDefaultDisplayMode中です。System.Web.WebPagesメソッドの基本実装は、を からにTransformPath変換します。virtualPath/Views/Home/Index.cshtml/Views/Home/Index.Mobile.cshtml

渡された exTransformPathを変更するメソッドをオーバーライドする必要があります。virtualPathから/Views/Home/Index.cshtmlまで/Views/MobileHome/Index.cshtml

public class CustomDisplayMode: DefaultDisplayMode
{
    // ...

    protected override string TransformPath(string virtualPath, string suffix)
    {
       if (String.IsNullOrEmpty(suffix))
       {
           return virtualPath;
       }

       // TO DO: modify the virtual path 
       // for ex. from /Views/Home/Index.cshtml to /Views/MobileHome/Index.cshtml

       return virtualPath;
    }
}

_StartからCustomDisplayModetoを設定する必要があります。URL を考慮に入れるように設定できます。DisplayModeProviderApplicationContextCondition

DisplayModeProvider.Instance.Modes.Insert(0, new CustomDefaultDisplayMode("Mobile")
{
    ContextCondition = (context => context.GetOverriddenBrowser().IsMobileDevice 
                         && check context.Request.Url contains the Mobile segment)
});
于 2012-07-25T14:52:05.710 に答える
0

Darinの応答のフォローアップ。ASP.NET MVC4 には、MobileViewEngines に基づく「View Switcher」が組み込まれています。

省略されている重要な詳細は、これらのビュー スイッチャーが、ユーザー エージェントに基づいて決定する前に、まず Cookie やサブドメイン (ビュー設定) などの他の変数の存在を確認することです。そうすれば、モバイル デバイスを使用しているユーザーがデスクトップ ビューに切り替えることができ、その逆も可能です。

ビュー スイッチャーは ViewEngine にフックされるため、Index.cshtml ビューをレンダリングする Index アクションを持つ Customer Controller がある場合、モバイル デバイスでは代わりに Index.mobile.cshtml ビューをレンダリングするようにルールを設定できます。特殊なビューを使用する設定を介して、カスタム サフィックスを作成できます。Index.iphone.cshtml を使用して、モバイル デバイス固有のビューをレンダリングします。

したがって、基本的に、MVC4 に存在する新しいメカニズムを使用すると、コントローラーとそのアクションは正常に動作し、代わりにビュー エンジンが異なるビューをレンダリングします。あなたのシナリオのようなことをしたい場合は、MobileCustomerコントローラーを領域に分割することをお勧めします-> Mobile(Area)-> CustomerController->など.

于 2012-07-25T13:42:47.420 に答える