付記として、私は あいまいなコントローラー名 の問題全体を理解し、ルートを機能させるためにネームスペースを使用したので、ここでは問題ではないと思います。
これまでのところ、プロジェクトレベルのコントローラーと、次の登録を持つユーザーエリアがあります。
_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 })
を使用すると問題なく動作します。
ルートマッピングにデフォルトがすでに存在する場合、アクションとコントローラを指定する必要があるのはなぜですか?何が欠けていますか?
.NET 4.5.1とMVC 5.2.2以降では、この動作が修正され、Url.RouteUrl("UserHome", new { id = 5 })
を使用した同じコードでそのまま動作することを確認できます。
これは私の投稿時から修正されているバグのようです。
TSmithのソリューションは機能しますが、修正されたため、追加の作業を行う必要がなくなったため、これを答えとして追加します。
誰でも以下の@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 })
まだ動作します。
これを試して:
@Url.Action("Index", "Home", new { Area = "User" })