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。

对于我试图解决的问题,有更好的解决方案吗?

ASP.Net MVC 4 w/AttributeRouting和多个RoutePrefix属性

像这样的东西怎么样

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

我发现这对RouteRoutePrefix属性不起作用,所以我不得不将它们全部删除。在这些情况下强迫我添加特定路线

routes.Add("Profile-Simple", new Route("{usertype}/profile/simple",
            new { controller = "ProfileSimple", action = "Index" }, new { usertype = userTypeRegex }));

我认为在我的RouteConfig文件中有六条硬编码的路由是一个更好的解决方案,而不是必须手动为我生成的每个URL添加值(就像Chris的解决方案中那样)。