7

重複の可能性:
AREAで作成されたコントローラーを登録するにはどうすればよいですか?

質問があります-次のことは可能ですか?

私には3つの領域があります:

_Default
SiteOne
SiteTwo

各エリア内には同じ名前のApiControllerがありますが、もちろん異なる名前空間にあります。

MvcAppliaction.Areas._Default.Controllers.ValuesController
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController

また、構成にcurrent(使用したい)Areaの値があります。

ユーザーがブラウザーに入力した場合、ユーザーを適切なエリア(構成で見つけることができます)のコントローラーにマップしたいと思います。

/api/values

たとえば、構成ファイルの現在の領域がSiteOneの場合、この要求はMvcAppliaction.Areas.SiteOne.Controllers.ValuesControllerコントローラーにマップする必要がありますが、構成ファイルの現在の領域を_DefaultのSiteTwoに変更すると、正しいコントローラーにマップする必要があります。

PS。MVCコントローラーを使用すると簡単です。ルートを設定するだけです。

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") }
);
4

3 に答える 3

12

次のusingステートメントを追加し、AreaRegistration.csファイルのルート登録を変更してみてください。

using System.Web.Http;
...
public override void RegisterArea(AreaRegistrationContext context)
{
        context.Routes.MapHttpRoute(
            name: this.AreaName,
            routeTemplate: this.AreaName + "/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
}
于 2012-03-24T03:54:34.683 に答える
7

エリアをサポートするためにHttpControllerFactoryを実装する方法についての投稿を作成しました

これで、Global.asaxファイルのMapHttpRouteでエリア名を指定できます。

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional }
        );
于 2012-03-26T14:50:45.740 に答える
4

私の提案は、カスタムDefaultControllerFactoryを実装することです。

ここで非常に良い例を見ることができます

デフォルトのコントローラーファクトリは、この種の機能を許可しないリストにすべてのコントローラーを名前でリストするだけです。上記の記事は、新しいファクトリを作成し、コントローラの作成を制御して、ルートを特定の名前空間に簡単に一致させる方法を示しています。

それはあなたが探している機能を与えるでしょう。

于 2012-03-24T16:21:02.940 に答える