17

補足として、あいまいなコントローラー名の問題全体を理解しており、名前空間を使用してルートを機能させているため、ここでは問題ではないと思います。

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

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 }
        );
    }
}

/User/5「 UserHome 」ルートがあるので、/User/Home/Index/5IMO よりきれいに見えるルートを許可できます。

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

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

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

4

3 に答える 3

9

以下の@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

免責事項httproute=trueルート宣言には望ましくない副作用がある可能性があります。

また、より冗長な使用:

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

まだ同様に動作します。

于 2013-10-25T16:35:20.477 に答える
3

少なくとも .NET 4.5.1 と MVC 5.2.2 で、この動作が修正され、Url.RouteUrl("UserHome", new { id = 5 }).

これは私の投稿時から修正されたバグだったようです。

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

于 2015-05-12T11:58:57.243 に答える