我添加了路由到我的解决方案,以便在地址栏中拥有更友好的用户界面。
我启动解决方案,当我翻转我的收藏夹链接时,我看到网址 ... / Affaire / Favorite (下图)。这个对我来说没问题。
当我翻转我的回收站链接时,我看到网址 ../ Affaire / Deleted (下图)。这个对我来说没问题。
然后我点击回收站链接,我导航到相应的页面,地址栏中显示的URL对我来说没问题(下图)。
接下来,我再次滚动收藏夹链接(下图),我看到URL ../ Affaire / Delete?OnlyFavorite = true !!那不行。
路由现在检索的属性不是来自我的链接,而是来自活动URL!此属性名为OnlyFavorite,我不想要此属性。这就是“反思”。请注意,我的所有路由都使用相同的控制器和相同的操作,但使用不同的路由属性。
以下是我使用的一些链接。
导航到收藏页面的示例:
@Html.ActionLink("Favorites", "SearchAffaires", new { OnlyFavorite = true })
导航到回收站页面的示例:
@Html.ActionLink("Recycle bin", "SearchAffaires", new { StatusCode = "DELETED" })
以下是我的路线:
routes.MapRoute(
"Affaire Status Open/Closed/Deleted", // Route name
"{controller}/{StatusCode}", // URL with parameters
new { action = "SearchAffaires" }, // Parameter defaults
new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" }// Contraints
);
routes.MapRoute(
"Affaire Only Favorite", // Route name
"{controller}/Favorite", // URL with parameters
new { action = "SearchAffaires", Page = 1, OnlyFavorite = true }, // Parameter defaults
new { controller = "Affaire" } // Contraints
);
您是否知道如何避免此行为?
我不希望路由通过reflexion从我当前的URL获取名为OnlyFavorite的属性。我已经尝试在动作链接上传递OnlyFavorite = null但它不起作用:路由说“好吧,我没有链接本身的OnlyFavorite值,但我在URL上只有OnlyFavorite所以我用它!“。
答案 0 :(得分:0)
当您在Deleted
页面上时,链接正在以这种方式处理,因为StatusCode
令牌等于已删除,因此第一条路线得到满足。更改链接如下:
@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true })
<强>已更新强>
最好的解决方案是扭转你的路线。作为一般规则,最具体的路线应该始终排在第一位,之后您应该拥有更多的通用路线。由于“Affaire Only Favorite”路线更具体,因此应始终先行。如果它是满足的第一条路线,那应解决您的问题。
更新#2
我运行了测试,当我按如下方式设置路线时,所有链接都正确生成:
routes.MapRoute(
"Affaire Only Favorite", // Route name
"Affaire/Favorite", // URL with parameters
new { controller = "Affaire", action = "SearchAffaires",
StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults
);
routes.MapRoute(
"Affaire Status Open/Closed/Deleted", // Route name
"{controller}/{StatusCode}", // URL with parameters
new { action = "SearchAffaires" }, // Parameter defaults
new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints
);
此外,还可以正确生成以下更通用的路由:
routes.MapRoute(
"Favorite", // Route name
"{controller}/Favorite", // URL with parameters
new { action = "Search",
StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults
);
routes.MapRoute(
"Status Open/Closed/Deleted", // Route name
"{controller}/{StatusCode}", // URL with parameters
new { action = "Search" }, // Parameter defaults
new { StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints
);
对于更通用的路由,我必须将操作重命名为Search
,我必须将每个链接从SearchAffaires更改为Search。
答案 1 :(得分:0)
好吧,你可以使用Html.RouteLink帮助器来指向所使用的路线。但是,正如@counsellorben指出的那样,你应该将更具体的路线设置为第一个。
如果您的网址显示“Affaire / Favorite / True”没有问题,那么您可以使用以下示例:
routes.MapRoute(
"Affaire Only Favorite", // Route name
"{controller}/Favorite/{OnlyFavorite}", // URL with parameters
new { action = "SearchAffaires", Page = 1, OnlyFavorite = ""}, // Parameter defaults
new { controller = "Affaire" } // Contraints
);