C# ASP.Net MVC 4 w/AttributeRouting和多个RoutePrefix属性 TL;博士

C# ASP.Net MVC 4 w/AttributeRouting和多个RoutePrefix属性 TL;博士,c#,asp.net-mvc,asp.net-mvc-4,attributerouting,C#,Asp.net Mvc,Asp.net Mvc 4,Attributerouting,我需要一种方法来编程选择在基于MVC应用程序中的用户属性生成URL时选择哪个RoutePrefix 不是TL;博士 我有一个MVC4应用程序(带有AttributeRouting NuGet包) 由于托管环境的要求,我的许多操作都必须有两条路径,以便托管环境可以有不同的访问权限 我用[RoutePrefix(“full”)][RoutePrefix(“lite)]装饰我的控制器来解决这个问题。它允许通过/full/{action}和/lite/{action}访问每个操作方法 这很好用 [Rou

我需要一种方法来编程选择在基于MVC应用程序中的用户属性生成URL时选择哪个RoutePrefix

不是TL;博士 我有一个MVC4应用程序(带有AttributeRouting NuGet包)

由于托管环境的要求,我的许多操作都必须有两条路径,以便托管环境可以有不同的访问权限

我用
[RoutePrefix(“full”)]
[RoutePrefix(“lite)]
装饰我的控制器来解决这个问题。它允许通过/full/{action}和/lite/{action}访问每个操作方法

这很好用

[RoutePrefix(“完整”)]
[RoutePrefix(“lite”)]
公共类结果控制器:BaseController
{
//可通过/full/results/your results和/lite/results/your results和
[路线(“结果/您的结果”)]
公共异步任务All()
{
}
}
但是,每个用户只能在其URL中使用full或lite,这由该用户的某些属性决定

显然,当我使用
RedirectToAction()
@Html.ActionLink()
时,它只会选择第一个可用的路由,不会保留“正确”的前缀

我想我可以重写
重定向到action()
方法,也可以添加自己版本的
@Html.ActionLink()
方法

这将是可行的,但对我来说,生成URL将涉及一些讨厌的代码,因为我得到的只是一个表示操作和控制器的字符串,而不是反映的类型。此外,可能还有路由属性,如我的示例中所示,因此我将不得不复制大量MVC内置代码


我想解决的问题有更好的解决方案吗?

下面的例子怎么样:

[RoutePrefix("{version:regex(^full|lite$)}")]
然后,当您创建链接时:

@Url.RouteUrl("SomeRoute", new { version = "full" })

您甚至可以执行以下操作来保留已设置的内容:

@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的解决方案)更好.

我很困惑,这些路由实际提供的内容是否有任何不同,或者只是url看起来不同,但返回给用户的数据相同?您是否使用url检查身份验证?url需要看起来不同,但返回给用户的数据相同。对于这两种不同,有一个外部身份验证系统不同类型的用户要求“lite”用户的所有URL都以/lite/为前缀,而“full”用户的所有URL都以“full”为前缀。我不确定这是否有效(从我的平板电脑atm键入),但您可以尝试将您的
resultcontroller
子类化为
fullresultcontroller
litesultcontroller
,并将相对的
RoutePrefix
属性应用于两者。无需复制任何代码。我希望这不是正在发生的唯一身份验证,或者这将非常容易(尽管这似乎毫无意义)让用户从
lite
更改为
full
。您可能希望了解如何使用重写规则或类似于您提到的方法,在创建路由后,使用自己的方法包装路由更改方法进行替换。@John不,有外部身份验证。仅此而已,它要求我的URL是str正如我提到的
routes.Add("Profile-Simple", new Route("{usertype}/profile/simple",
            new { controller = "ProfileSimple", action = "Index" }, new { usertype = userTypeRegex }));