web-dev-qa-db-ja.com

エリア内のルート名でUrl.RouteUrl()を使用する

付記として、私は あいまいなコントローラー名 の問題全体を理解し、ルートを機能させるためにネームスペースを使用したので、ここでは問題ではないと思います。

これまでのところ、プロジェクトレベルのコントローラーと、次の登録を持つユーザーエリアがあります。

_public class UserAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "User";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "UserHome",
            "User/{id}",
            new { action = "Index", controller = "Home", id = 0 },
            new { controller = @"Home", id = @"\d+" }
        );

        context.MapRoute(
            "UserDefault",
            "User/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}
_

「UserHome」ルートがあるので、_/User/5_と_/User/Home/Index/5_のルートを許可できます。

理想的にはUrl.RouteUrl("UserHome", new { id = 5 })を使用して別の場所でルートを生成したいのですが、これは常に空白になるか、ルート名が見つからないという例外が表示されます。

ただし、Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })を使用すると問題なく動作します。

ルートマッピングにデフォルトがすでに存在する場合、アクションとコントローラを指定する必要があるのはなぜですか?何が欠けていますか?

16
ryanulit

.NET 4.5.1とMVC 5.2.2以降では、この動作が修正され、Url.RouteUrl("UserHome", new { id = 5 })を使用した同じコードでそのまま動作することを確認できます。

これは私の投稿時から修正されているバグのようです。

TSmithのソリューションは機能しますが、修正されたため、追加の作業を行う必要がなくなったため、これを答えとして追加します。

2
ryanulit

誰でも以下の@ryanulitの回答を参照してください。この問題は、新しいフレームワークバージョンで修正される可能性があります。

ホットフィックスがあったかどうかはわかりませんが、動作が少し異なります。正確なコードを使用して試してください:

Url.RouteUrl("UserHome", new { id = 5 })

私は今得ます:

/User/5?httproute=True 

これはまだぎこちないように見えるので、ルートを試し、別のデフォルトパラメータを追加しました。

 context.MapRoute(
            "UserHome",
            "User/{id}",
            new { action = "Index", controller = "Home", area = "User", id = 0, 
                       httproute = true },
            new { controller = @"Home", id = @"\d+" }
        );

今私が使うとき

Url.RouteUrl("UserHome", new { id = 5 })

私はニースのURLを取得します

/User/5

disclaimerルート宣言にhttproute=trueの望ましくない副作用がある可能性があります。

また、より冗長な使用:

@Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })

まだ動作します。

8
TSmith

これを試して:

@Url.Action("Index", "Home", new { Area = "User" })
3
Robson Douglas