3

プラットフォーム: ASP.NET 4.0、MVC 4 RC、VS 2012

更新: 私は自分の質問に答えました。以下の私の回答投稿をご覧ください

私がしたいこと:

現在、特定の顧客セグメントを対象とした www.a.com というサイトを運営しています。別のセグメントをターゲットとする www.b.com という亜種を作成したいと考えています。

ただし、バックグラウンドでは、a と b のテクノロジとコードはほとんどの部分で同じであり、ユーザーがドメイン a と b のどちらを使用してブラウジングしているかによって、一部のページ/コンテンツのみが異なります。この目的のために新しいプロジェクトを作成することは、私にとってまったく意味がありません。

ただし、www.b.com をどのように実装する必要があるかはまったく明確ではなく、MVC でのフローです。誰かが www.b.com から来て、www.a.com と同じ多くのページを通過するときに別のホームページをレンダリングする方法。

いくつかのポインタ、ヒント、例は大歓迎です。

更新: 私は自分の質問に答えました。以下の私の回答投稿をご覧ください

4

3 に答える 3

2

ドメイン名に依存している場合は、変更される可能性のある情報をハード コーディングすることになります。というより、サブドメインベースでやってください。まだいくつかの情報をハードコーディングしていますが、サブドメインの方法はより柔軟で、開発中の作業がより簡単になります.

その後、各ドメインから正しいサブドメインにリダイレクトできます。

例えば

www.a.com # => redirects to site_a.somedomain.com
www.b.com # => redirects to site_b.somedomain.com

次に、サブドメイン (site_a または site_b) に依存してレンダリングするレイアウトを決定する 1 つの Web サイトを構築できます。

これにより、ドメイン名が変更された場合でも、Web サイトは引き続き機能します。

于 2012-07-01T01:44:42.023 に答える
2

これと同様のソリューションを従来の ASP に実装したことがあります。私がしたことは少し醜いですが、うまくいきました:

  • ドメイン (はい、サイトごとに複数)、背景、メインの色などを含む、sites というテーブルを作成しました。

  • コンテンツ テーブルに列サイトを追加しました。サイト ID の FK です。

  • この情報を変更するための管理パネルを作成しました。

  • 各リクエストで実行される関数を作成しました(私の場合、インクルードファイルを介して各ページで実行されます)によってドメイン名を取得Request.ServerVariables["SERVER_NAME"]し、テーブルを調べました。一致が見つかった場合、id はそのドメインの Cookie にサイト構成情報をサイト ID と共に保存し、この値でセッション変数をロードするので、それを使用して適切なコンテンツをクエリし、「異なる」レイアウトを表示できます。次回のアクセス時に、Cookie をチェックし、存在する場合は、この情報をセッションに読み込みます。そうでない場合は、DB から再度ロードします。

  • 関数が一致するものを見つけられない場合、「工事中のページ」にリダイレクトされます。

于 2012-07-01T01:58:34.523 に答える
0

これが私が最終的にやったことです

まず、私の投稿に回答してくださった方々のおかげで、私に何ができるかを考えさせていただきました。結局、私がやったことはかなり単純な一連のことでした。方法は次のとおりです。

  1. 新しいドメイン www.b.com を自分の Web ホストに向けたので、www.b.com と入力すると www.a.com (CNAME) のルートがポイントされます。

  2. 私のソリューションでは、次のことを行いました

すべてのコントローラーが派生する BaseController があり、そこで IsPageB を宣言しました

public class BaseController : Controller
    {
        //
        // GET: /Base/
...
        protected bool IsPageB = false;
....
    }

BaseController では、ホストに応じて値を設定します

 protected override void OnActionExecuting(ActionExecutingContext ctx)
 {           
       ...
       IsPageB =  Request.Url.Host.Contains("b.com");
       ... 
  }

したがって、各コントローラーで IsPageB を確認します

たとえば、ホームページでは、この変数に応じてビューを切り替えただけです

public ActionResult Index()
{
    if (IsPageB)
        return View("B_Home");

    return View();
}

ビュー内では、コントローラーに設定した ViewBag.IsPageB を使用するか、ビューを生成するコントローラーがない場合は、単純にローカル変数を設定します。

@{
    bool isPageB = Request.Url.Host.Contains("b.com");
}

そして、この値に基づいてマークアップを生成します。

おそらくこれを行うためのより賢い方法がありますが、基礎となるコードの 90% が a または b で同じであり、いくつかの出力が変更されるという私の目的では、これで問題ありません。しかし、私は常によりクリーンな方法を探しています。たとえば、ViewBag を使用したり、モデルにアタッチしたりせずに、ビューで IsPageB 変数にアクセスできる方法はありますか?

于 2012-07-03T12:55:27.980 に答える