3

私はWeb開発とASP.NETMVCに慣れていないので、誰かがこの問題について私を助けてくれるといいですね。私の目標は、ユーザーが独自のミニWebサイトを作成するのに役立つMVCアプリケーションを設計することです。各ユーザーは、自分のミニWebサイトと、サイトのページとテンプレートを変更するための管理パネルを取得します。同様のことを達成するためのスクリプトはそこにあると思いますが、特定の要件に合わせて独自のスクリプトを作成する必要があります。その目標に向けて、メインのmvc 3アプリケーションを作成し、その下にサイトとしてエリアを作成しました。www.site1.mainsite.comのような独自のサブドメインURLをユーザーに持たせたいと考えています。ここで、site1はユーザーのミニサイトの名前です。そのために、メインサイト用と次のようなエリア用に2つのルートを追加しました。

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "MainSite.UI.Controllers" }
        );

エリア内登録

context.MapRoute(
            "Sites_default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new {controller = new SiteConstraint()},
            new[] { "MainSite.UI.Areas.Site.Controllers" });

どちらも同じURLタイプですが、エリアルートには次のように追加した制約があります

var url = httpContext.Request.Headers["HOST"];
        var storeName = url.Split('.')[1];
        var match = storeName != "mainsite";
        return match;

これまでのところ機能していますが、私はそれが良いデザインだとは思いません。これとは別に、もう2つの領域を追加する必要があります。1つはsiteadminで、もう1つはブログです。これを達成するための最良の方法は何ですか?

  • サブドメインのURLは、エリア「サイト」に送信する必要があります
  • サブドメインのurl/Adminはエリア「siteadmin」にルーティングする必要があります
  • ドメイン/ブログはブログエリアにルーティングする必要があります。
  • ドメインの他のURLはメインコントローラーで処理する必要があります

前もって感謝します

4

1 に答える 1

1

返事は1つもありませんでした:(しかし、ルートを試してみて、探していたものに近いものを達成しました。RouteDebuggerのおかげ、ルートのどこが悪いのかを知ることができました。

別のエリア「管理者」を追加して、以下のルートに登録してみたところ

context.MapRoute(
            "SiteAdmin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional },
            new { controller = new SiteConstraint() },
            new[] { "MainSite.UI.Areas.SiteAdmin.Controllers" }
        );  

物事はうまくいかなくなり始めました。ルートデバッガーは、何が起こっているのかを理解するのに役立ちました。私にとってルートの順序は本当に重要だったので、自分のエリアが正しい順序で登録されていることを確認する必要がありました。

AreaRegistration.RegisterAllAreas()

私のルートを正しい順序で登録していなかったので、グーグルは私にこのヘルパーメソッドを与えました。

public static class RouteHelper
{
    public static void RegisterArea<T>(RouteCollection routes, object state) where T : AreaRegistration
    {
        var registration = (AreaRegistration)Activator.CreateInstance(typeof(T));
        var context = new AreaRegistrationContext(registration.AreaName, routes, state);
        var tNamespace = registration.GetType().Namespace;
        if (tNamespace != null)
        {
            context.Namespaces.Add(tNamespace + ".*");
        }
        registration.RegisterArea(context);
    }
}

その方法は、グローバルasaxに必要な順序でエリアを登録するのに役立ちました。

 RouteHelper.RegisterArea<SiteAdminAreaRegistration>(RouteTable.Routes, null);
 RouteHelper.RegisterArea<SiteAreaRegistration>(RouteTable.Routes, null);

私はそれを書き留めています、他の誰かがそれが役に立つと思うかもしれないように私が答えとしてこれまでに得たもの。

于 2012-07-11T20:24:07.313 に答える