C# 如何区分两个路由:一个用于无参数操作,另一个用于带一个参数的索引操作?
我有一个具有多个操作的控制器,我设置了以下路径:C# 如何区分两个路由:一个用于无参数操作,另一个用于带一个参数的索引操作?,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,我有一个具有多个操作的控制器,我设置了以下路径: routes.MapRoute( name: "MyCustomRoute", url: "MyTarget/{option}", defaults: new { controller = "MyTarget", action = "Index", option = "" } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}"
routes.MapRoute(
name: "MyCustomRoute",
url: "MyTarget/{option}",
defaults: new { controller = "MyTarget", action = "Index", option = "" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这里的主要思想是调用MyTarget
控制器的Index
操作作为默认值,只传递URL中的参数
轻量级控制器如下所示:
public class MyTargetController : Controller
{
public ActionResult Index(string option)
{ ... }
public ActionResult FirstAction()
{ ... }
public ActionResult SecondAction(param list)
{ ... }
}
MyCustomRoute
设置为将MyWebsite/MyTarget/randomOption
映射到索引
操作,将randomOption
作为选项
参数传递。问题是此路由也捕获所有其他操作:MyWebsite/MyTarget/FirstAction
和MyWebsite/MyTarget/SecondAction
(忽略缺少参数)映射到索引
操作,它们的名称作为选项
参数路由
我不想将URL更改为类似于MyWebsite/MyTarget/Index/randomOption
的内容。是否有明确的方法来区分带有一个参数的默认操作和可能有或可能没有参数的其他操作
编辑:可以实施以下变通方法,平衡优缺点:
- 除了
之外的所有操作都可以移动到辅助控制器:创建两个单独的控制器,处理相同的逻辑李>索引
- 可以创建自定义路由约束,检查参数值是否与现有操作的名称相对应(除了
):需要一种存储操作名称的方法,并且需要在每次向控制器添加新操作时更新列表(反射可能是更好的方法)Index
上述任何一种解决方法都不能保证接缝美观且不需要任何“特殊”处理。也许您可以为第一条管线添加管线约束,以排除选项参数的“FirstAction”和“SecondAction”等值。像这样的约束。然而,每次你添加/重命名一个操作时,你都需要更新该列表…@DanielJ.G.,我正在考虑在说话时使用约束(或者在打字时使用约束)。我不太喜欢这个解决方案,但我想不出任何其他解决方案,除非更改URL。让我们看看是否有其他人有不同的方法@DanielJ.G.,我也不喜欢它,在这一点上,我想我喜欢它比创建助手控制器要少。