ASP.Net MVC 4 w/AttributeRouting和多个RoutePrefix属性
本文关键字:RoutePrefix 属性 AttributeRouting Net MVC ASP | 更新日期: 2023-09-27 18:27:38
TL;DR
我需要一种在MVC应用中根据用户的属性生成URL时,用程序选择RoutePrefix的方法
非TL;DR
我有一个MVC 4应用程序(带有AttributeRouting NuGet包)
由于托管环境的要求,我的很多操作都必须有两条路线,这样托管环境才能有不同的访问权限。
我通过用[RoutePrefix("full")]
[RoutePrefix("lite)]
装饰我的控制器来解决这个问题。这允许通过/full/{action}和/lite/{action}访问每个动作方法。
这非常有效。
[RoutePrefix("full")]
[RoutePrefix("lite")]
public class ResultsController : BaseController
{
// Can be accessed via /full/results/your-results and /lite/results/your-results and
[Route("results/your-results")]
public async Task<ActionResult> All()
{
}
}
但是,每个用户在其url中只能使用full或lite,这是由该用户的某些属性决定的。
显然,当我使用RedirectToAction()
或@Html.ActionLink()
时,它只会选择第一个可用的路由,不会保留"正确"的前缀。
我想我可以覆盖RedirectToAction()
方法,也可以添加我自己版本的@Html.ActionLink()
方法。
这将起作用,但对我来说,生成URL将涉及一些讨厌的代码,因为我得到的只是一个表示操作和控制器的字符串,而不是反映的类型。此外,可能还有路由属性,例如在我的示例中,所以我将不得不复制许多代码中内置的MVC。
对于我试图解决的问题,有更好的解决方案吗?
像这样的东西怎么样
[RoutePrefix("{version:regex(^full|lite$)}")]
然后,当你创建链接时:
@Url.RouteUrl("SomeRoute", new { version = "full" })
或
@Url.RouteUrl("SomeRoute", new { version = "lite" })
您甚至可以执行以下操作来保留已经设置的内容:
@Url.RouteUrl("SomeRoute", new { version = Request["version"] })
我最终找到了这个的解决方案
我只是高估了默认路线以包含这一点。ASP.Net自动保留usertype值,并在重新生成路由时将其放回
const string userTypeRegex = "^(full|lite)$";
routes.Add("Default", new Route("{usertype}/{controller}/{action}/{id}",
new { controller = "Sessions", action = "Login", id = UrlParameter.Optional }, new { usertype = userTypeRegex }));
我发现这对Route
或RoutePrefix
属性不起作用,所以我不得不将它们全部删除。在这些情况下强迫我添加特定路线
routes.Add("Profile-Simple", new Route("{usertype}/profile/simple",
new { controller = "ProfileSimple", action = "Index" }, new { usertype = userTypeRegex }));
我认为在我的RouteConfig
文件中有六条硬编码的路由是一个更好的解决方案,而不是必须手动为我生成的每个URL添加值(就像Chris的解决方案中那样)。