2017-01-26 28 views
0

私はASP.Net MVCのWebサイト「Mandarin online online」を持っています。運用可能で、うまく動作しています。今、このウェブサイトを新しいウェブサイトのテンプレートとして再利用したい、「スペイン語をオンラインで学ぶ」どちらのウェブサイトも完全に異なるドメイン上にあり、まったく異なるサーバー上にあります。私の「オンラインマンダリンを学ぶ」のウェブサイトのため外部ページが異なる2つの異なるWebサイトの構造、内部ページは同じです

、ウェブページの1/3は、ユーザーがウェブサイトにログインせずに閲覧することができます外部ページです。 他の2/3のウェブページは内部ページであり、ユーザーがウェブサイトにログインしている場合にのみ見ることができます。 両方のWebサイトで異なる外部ページ(両方のサイトで外部の.aspxページが異なる)を使用しますが、両方のWebサイトが同じ内部ページのセットを共有するようにします(内部の.aspxページは両方のWebサイト)。

私の質問は、ASP.Net MVCで、どのように両方のWebサイトのプロジェクト/ソリューションを構成できますか?両方のWebサイトの唯一の違いは外部ページなので、外部ページを処理するために考えられる最も簡単な解決策は、各ビューのマッピングをデータベースに保存し、一定の定数(つまりWebsiteType)に基づいてデータベースからこのマッピングを取得し、 web.configで設定し、マッピングに基づいてビューを返します。例えば、私のコントローラで:

// WebsiteType is stored in web.config. It is set to LearnMandarin for the learn Manadarin 
// online website and it is set to LearnSpanish for the learn Spanish online website 
string websiteType = WebConfigurationManager.AppSettings["WebsiteType"]; 

// figure out which Homepage .aspx view to return, based on the websiteType 
// GetView(...) will get the mapping from the database 
string viewToReturn = GetView(websiteType, "HomepageView"); 

return View(viewToReturn); 

これは私がこれまでの考えることができるきれいな解決策と私は考えることができる最善の構造です。私は同じディレクトリに2つの異なる.aspxファイルを持つことになります.1つの.aspxページは、MandarinのオンラインWebサイトを学習するためのページ、もう1つは、スペイン語のWebサイトを学習するためのanother.aspxファイルです。これは私のプロジェクトを構成する最善の方法ですか、それとももっとクリーンな方法ですか?

(Iは、Visual Studio 2010とASP.Net MVCのバージョン3.0.0.0を使用しています)

+0

これはMVCの*エリア*機能は持っているものは本当にあります〜のために作成されました! – Haney

+0

私の内部ページはエリアの下にあるべきではありませんが、私の外部ページはエリアの下にあるべきですか?私はAreaを使うのが初めてだから、スピードアップしていなければ謝罪します(私は今それをチュートリアルで読んでいます)。 –

+0

Webサイトのドメインやその他の要因に基づいてArea RequestContextデータを設定する属性を作成し、適切な場所にページを配置することができます。 – Haney

答えて

0

多かれ少なかれハニーが推奨するエリア。私は私のプロジェクトでSpanishTutorというエリアを作成しました。領域を作成すると、典型的なASP.Net MVCプロジェクトと同じコントローラとビューのフォルダ構造になります(ただし、すべてが領域サブフォルダの下にあります)。私は私のホームページを私の「外部」ページの1つと考えています。したがって、私はSpanishTutor領域の下の "controller"フォルダにHomeController.csファイルを作成します。このHomeControllers.csファイルでは、既存のHomeController.csファイルと競合しないように、名前空間を「Tutors.Areas.SpanishTutor.Controllers」に変更する必要がありました。また、SpanishTutorエリアの「views」フォルダの下にIndex.aspxを持つホームフォルダを作成します。

次に、私は、 "learn Spanish online"ホームページのルーティングを無効にするために、 "learn Spanish online"ホームページのルーティングを登録する必要がありました。 SpanishTutor領域を作成すると、SpanishTutorAreaRegistration.csという.csファイルが作成されます。このファイルには、RegisterArea(...)に次のコードを追加します

public override void RegisterArea(AreaRegistrationContext context) 
{ 

    string websiteType = WebConfigurationManager.AppSettings["WebsiteType"]; 

    if (websiteType.Contains("spanishtutor")) 
    { 
    context.MapRoute(
     "SpanishTutor_Root", // Route name 
     "", // override the homepage 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new[] { "Tutors.Areas.SpanishTutor.Controllers" } // namespace so there is no conflict with the namespace of the original homeapge 
    ); 
    } 
} 

あなたはより多くの外部のウェブページを持っている場合は、あなただけのホームページのように、それぞれ外部のウェブページを追加することができます。私にとっては、Global.asax.csを変更する必要はありませんでした。私のweb.configファイルで

、以下を追加します(私は「オンラインマンダリンを学ぶ」ウェブサイト「mandarintutor」にそれを変更することができます):

<add key="WebsiteType" value="spanishtutor" /> 
0

まあ、私はある程度、@Haneyに同意するだろう。サイトのマンダリン/スペイン語の保護されたセクションがどのように異なっているかによって実際に異なります。一般に、保護されたセクションと保護されていないセクションとの間の分割は単純である。ログインしたユーザーだけが使用できるコントローラー/アクションは、[Authorize]属性で保護する必要があります。たとえば、マンダリンに登録したユーザーのみをマンダリンセクションに制限するような操作を行うには、ロールを使用します。たとえば、ユーザーを「標準語」の役割に割り当ててから、その役割のユーザーのみがアクセスできるように指定します([Authorize(Roles = "Mandarin")])。

iffyは、マンダリンとスペイン語のセクションの区別がついています。ほとんどの場合、実際には言語をルートパラメータにすることができます。つまり、北京のすべてのページには/mandarin/some/page/のようなURLがありますが、スペイン語のページには/spanish/some/page/のようなURLがあります。ルートパラメータを使用して、レイアウトを切り替えたり、内部のアクションやビューなどを分岐したりできます。ただし、これらの2つのセクションの間に大きな違いがある場合、この分岐はすべて複雑なコードになる可能性があります。そうなった場合は、各言語を別々の領域として作成する方が適切かもしれません。各エリアには分離されたルーティングスキームが設定されます。つまり、お使いのエリアの名前がMandarinの場合、そのエリア内のすべてのコントローラのアクションは自動的に/mandarin/some/page/のようなURLの下にあります。遊びの中で言語を判断するためのルートの「マンダリン」の部分をキャプチャする必要はありません。単に、その領域内でコントローラのアクションを打つだけで、あなたは知っているでしょう。しかし、このアプローチの欠点は、コードの重複を招く可能性があることです。コントローラーと継承を見ることでそのほとんどを防ぐことができますが、どちらの領域にも非常に似たコードで終了する状況があります。

+0

Chrisに感謝します。私はそれを考え出した。私が投稿した解決策を見てください。ご協力いただきありがとうございます! –

関連する問題