gpt4 book ai didi

asp.net-mvc-3 - 带有可选第一个参数的 ASP.net MVC 路由

转载 作者:行者123 更新时间:2023-12-04 02:42:30 24 4
gpt4 key购买 nike

我需要为其中一个网站提供以下功能。

http://www.example.com/ 【赞助商】/{ Controller }/{ Action }

根据[赞助商],必须定制网页。

我尝试组合使用 Application_Start 和 Session_Start 注册路由,但无法使其正常工作。

public static void RegisterRoutes(RouteCollection routes, string sponsor)
{
if (routes[sponsor] == null)
{
routes.MapRoute(
sponsor, // Route name
sponsor + "/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
}

此外,没有 的默认行为【赞助商】也应该起作用。
有人可以让我知道在 MVC3 URL 中有一个可选的第一个参数在技术上是否可行。如果是,请分享实现。谢谢。

更新代码
按照 Sergey Kudriavtsev 的建议进行更改后,代码在给定值时工作。
如果未提供名称,则 MVC 不会路由到 Controller /操作。

请注意,这仅适用于家庭 Controller (包括和非赞助商)。对于其他 Controller / Action ,即使指定了赞助商参数,它也不是路由。

请建议必须修改的内容。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
"NonSponsorRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor = string.Empty }
);
}

操作方法
public ActionResult Index(string sponsor)
{
}

最佳答案

在你的情况下 sponsor不应将其视为 URL 的常量部分,而应视为可变部分。

在 Global.asax 中:

public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"NonSponsorRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);

...
}

例如,在您的 Controller 中,HomeController.cs:
namespace YourWebApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index(string sponsor)
{
// Here you can do any pre-processing depending on sponsor value, including redirects etc.
}
...
}
}

请注意,此参数的类型将始终为 System.String和路由模板组件的名称 {sponsor}必须完全匹配操作参数的名称 string sponsor在你的 Controller 中。

UPD:为非赞助商案件添加了第二条路线。

请注意,这样的设置会使您的逻辑复杂化,因为您可能会混淆不同的 url,例如 URL

http://www.example.com/a/b/c

可以由两条路线匹配:第一个路线将有sponsor=a、controller=b和action=c;第二个将有 Controller =a, Action =b 和 id=c。

如果您对 URL 指定更严格的要求,则可以避免这种情况 - 例如,您可能希望 ID 仅为数字。限制在 routes.MapRoute() 的第四个参数中指定功能。

另一种消除歧义的方法是在赞助商的通用路由之前为所有 Controller 指定单独的路由(通常你的应用程序中不会有很多 Controller )。

更新:

区分赞助商和非赞助商路由的最直接但最难维护的方法是指定特定于 Controller 的路由,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"HomeRoute",
"Home/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);
routes.MapRoute(
"AccountRoute",
"Account/{action}/{id}", // URL with parameters
new { controller = "Account", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);

...

routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

...
}

请注意,此处必须添加所有特定于 Controller 的路由 之前 赞助路线。

更复杂但更干净的方法是为赞助商和 Controller 名称实现 RouteConstraints,如@counsellorben 的回答中所述。

关于asp.net-mvc-3 - 带有可选第一个参数的 ASP.net MVC 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8310815/

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