Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何区分两个路由:一个用于无参数操作,另一个用于带一个参数的索引操作?_C#_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

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.,我也不喜欢它,在这一点上,我想我喜欢它比创建助手控制器要少。