1

エリアを備えたMVC3アプリケーションがあり、特定のエリアとコントローラーからのサービスを公開しています。このサービスへのルーティングは、AreaRegistration内で次のように定義されます。

public class AreaAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Area"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.Routes.Add(
            new ServiceRoute("Area/Controller/Service",
                new NinjectServiceHostFactory(), typeof(MyService)));

        // ....
    }
}

Global.asax.csの場合、デフォルトルートのみを定義します

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

_Layout.chshtmlのホームページへのリンクがあり、そこに空の領域を指定します。これにより、上部のフォルダー(Areasフォルダーの外)にIndexアクションが見つかると思います。HomeControllerControllers

@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)

何らかの理由で、これは次ActionLinkのようにレンダリングされます

~/Area/Controller/Service?action=Index&controller=Home

ServiceRouteをコメントアウトすると、同じことが私が期待していることですActionLink~/

このルーティングの問題を修正する方法はありますか?私が見つけた唯一の回避策は、代わりにこれを使用することです。

<a href="@Url.Content("~/")">Home</a>
4

1 に答える 1

0

これとまったく同じ問題がありました。global.asax コードからのルートの前に、エリアからのルートが登録されるという点で、ルート登録の順序が問題のようです。

この問題を解決するには、サービスへの URL ルートを許可し、ポストバックがサービス URL をターゲットにしないようにします。他のルートが登録された後、ServiceRoute 追加を Global.asax.cs に移動してみてください。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    context.Routes.Add(
        new ServiceRoute("Area/Controller/Service",
            new NinjectServiceHostFactory(), typeof(MyService)));

}

これは私たちにとってはうまくいきましたが、もちろん、メイン プロジェクトの領域に関連するコードを配置するというオーバーヘッドが生じます。

于 2014-06-12T10:14:55.667 に答える