6

基本的な機能を備えたサイトを持っていますが、さまざまなクライアントやさまざまなパートナーに基づいてオーバーライドできます。ルーティングは、ルートの一部としてクライアント名とパートナー名を処理するように設定されています。

   routes.MapRoute(
                "DefaultRoute", // Route name
                "{client}/{portal}/{controller}/{action}/{id}", // URL with parameters
                new { client="UNKNOWN", portal="UNKNOWN", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                new string[] { "Enterprise.Portal.Controllers" }
            );

通常のビューに取って代わるビューが存在するかどうかを判断するためのヘルパー クラスがあります。サイトにはさまざまなクライアントがあり、各クライアントにはさまざまなパートナーがいます。これらのクライアントは、既定のビューが必要ない場合に HTML を提供できます。パートナーも同じことを行うことができます。これらの代替ビューをフォルダーに保存します。ヘルパー クラスは情報を取得し、別のビューが存在する場合は、このビューへのファイル パスを返します。null または空の文字列を返す場合は、通常のビューが使用されます。

public static string ViewPath(string basePath, string client, string partner, string controller, string viewname)
// This returns something like C:\Sites\Portal\UI\ClientName\PartnerName\ControllerName\View.cshtml

私のコントローラーでは、これが null 以外または空の値を返す場合、そのビューを使用するにはどうすればよいですか。これが私がやったことですが、うまくいきません:

        if (String.IsNullOrEmpty(this.model.CurrentViewLocation))
        {
            return View(model);
        }
        else
        {
            return View(this.model.CurrentViewLocation, model);
        }

return View() コンストラクターはパス名を使用できず、ビュー名のみを使用できるため、次のエラーが発生します。これを達成する方法はありますか?「~\UI\Client\Partner\Controller\View.cshtml」のように、必要に応じてパスを仮想 Web パスに変換できます。

 Server Error in '/' Application

The view 'C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.aspx
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.ascx
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.aspx
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.ascx
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.cshtml
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.vbhtml
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.cshtml
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.vbhtml

これを行うためのより良い方法は、ビューの検索に使用されるビュー エンジンの場所の形式にクライアント フォルダーとパートナー フォルダーを追加することだと思います。ただし、フォーマット文字列には、コントローラの {0} とビュー名の {1} しか含まれていません。どちらもルートを介して渡されるクライアントとパートナーも渡すには、それをオーバーライドする必要があります。

4

1 に答える 1

17

「~\UI\Client\Partner\Controller\View.cshtml」のように、必要に応じてパスを仮想 Web パスに変換できます。

はい、それはまさにあなたがすべきことです。なぜなら、それがViewメソッドが期待するものだからです - ウェブサイトのルートへの相対パス:

return View("~/UI/Client/Partner/Controller/View.cshtml", someViewModel);
于 2013-08-28T14:44:46.413 に答える