gpt4 book ai didi

asp.net-mvc - Asp.Net MVC 路由在 5.1 中无法按预期工作

转载 作者:行者123 更新时间:2023-12-04 08:45:37 24 4
gpt4 key购买 nike

我需要将区域性添加到 url 以支持我的 asp.net mvc 应用程序中的本地化,其 url 如下:sample.com/ zh /关于
sample.com/ zh /产品/2342

我最近将我的应用程序从 MVC 5.0 升级到 5.1,但路由没有按预期工作,所以我创建了一个新的 asp.net mvc 5.0 测试应用程序,并在几分钟内让文化出现在 url 中。但是,一旦我将此测试应用程序升级到 MVC 5.1,链接中就不再生成文化,如果您手动将其键入 url,则会收到 404 错误。

我压缩了我的 5.0 和 5.1 测试应用程序 here .我需要帮助理解为什么这在 MVC 5.1 中不起作用以及如何纠正它。也许我对路由的理解有缺陷,或者这是 5.1 的一个合法错误?

在这个测试应用程序中,Home/About 操作应用了一个路由属性[Route("about")]并且预计当生成该路由的链接时,它应该是 localhost/en/about但它只是 localhost/about .如果您键入 localhost/en/about在地址栏中,您将在 Mvc 5.1 测试应用程序中收到 404 错误。

以下是在 MVC 5.0 中工作的相关代码:

public class RouteConfig
{
private const string STR_Culture = "culture";
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { culture = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

foreach (var item in routes)
{
// this works in MVC 5.0
if (item is Route)
{
var route = item as Route;
if (route.Url.IndexOf("{" + STR_Culture + "}") == -1)
route.Url = String.Format("{{{0}}}/{1}", STR_Culture, route.Url);

//AddCulture(route.Defaults);
}
}
}
private static void AddCulture(RouteValueDictionary dictionary)
{
if (dictionary == null)
dictionary = new RouteValueDictionary();

if (dictionary.ContainsKey(STR_Culture) == false)
dictionary.Add(STR_Culture, "en");
}
}

最佳答案

好的,想通了。 MVC 5.1 引入了重大更改。在上面的代码中,有一个 foreach 循环会动态更改所有路由 url 以附加“{culture}/”占位符。例如路线 about变成 {culture}/about等等。

这在 5.0 中有效,因为路由属于 System.Web.Routing.Route 类型。在 5.1 中,他们引入了一堆额外的类。其中之一称为 LinkGenerationRoute,用于通过属性路由应用的所有路由。此类保留在初始调用 routes.MapMvcAttributeRoutes(); 期间进行的原始 Route 的私有(private)只读引用。注册基于属性的路由。然后这个类通过将其各个属性发送到它继承自的基类来克隆该路由:Route。

在 foreach 循环中,我有效地修改了基类的 Url,但是 不是 LinkGenerationRoute 所持有的内部引用的 Route 对象。效果是框架内现在有两个 Route 实例,我们只能在创建基础实例后对其进行修改。不幸的是,内部路由(_innerRoute)用于获取虚拟路径,从而导致链接生成不正确,因为它在创建后无法修改。

看起来唯一的方法是在每个路由定义中手动添加这个占位符。例如
[Route("{culture}/about")] , [Route("{culture}/contact")] , [Route("{culture}/product/{productId:int}")]等等。

归根结底,我认为在此类中保留对 Route 的内部引用毫无意义。应该使用当前实例。例如this.GetVirtualPath(requestContext, values);

internal class LinkGenerationRoute : Route
{
private readonly Route _innerRoute; // original route cannot be modified

public LinkGenerationRoute(Route innerRoute)
: base(innerRoute.Url, innerRoute.Defaults, innerRoute.Constraints, innerRoute.DataTokens,
innerRoute.RouteHandler) // original route is effectively cloned by sending individual properties to base class
{
if (innerRoute == null)
{
throw Error.ArgumentNull("innerRoute");
}

_innerRoute = innerRoute;
}

public override RouteData GetRouteData(HttpContextBase httpContext)
{
// Claims no routes
return null;
}

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
// internal route is used for getting the virtual path. fail..
return _innerRoute.GetVirtualPath(requestContext, values);
}
}

关于asp.net-mvc - Asp.Net MVC 路由在 5.1 中无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com