【发布时间】:2014-10-23 13:54:52
【问题描述】:
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。
我要解决的问题有更好的解决方案吗?
【问题讨论】:
-
我很困惑,这些路由实际提供的内容是否有任何区别,或者只是 url 看起来不同但返回给用户的数据相同?您是否使用 url 来检查身份验证?
-
URL 需要看起来不同,但返回给用户的数据相同。对于两种不同类型的用户有一个外部身份验证系统,要求“lite”用户的所有 URL 都以 /lite/ 为前缀,“full”用户的所有 URL 都以“full”为前缀
-
我不确定它是否有效(从我的平板电脑 atm 打字),但您可以尝试将您的
ResultsController子类化为FullResultsController和LiteResultsController,并应用相对的RoutePrefix两者的属性。无需复制任何代码。 -
我希望这不是唯一正在发生的身份验证,否则用户从
lite更改为full将非常容易(尽管看起来毫无意义)。您可能想了解如何使用重写规则或类似您提到的东西,用您自己的方法包装路由更改方法,在创建路由后进行替换。 -
@John 不,有外部身份验证。只是为了让它起作用,它需要按照我提到的那样构建我的 URL
标签: c# asp.net-mvc asp.net-mvc-4 attributerouting