如何区分两条路径:一条用于无参数动作,一条用于带一个参数的索引动作?

时间:2014-01-06 14:42:39

标签: 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}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这里的主要思想是将Index控制器的MyTarget操作调用为默认值,仅传递URL中的参数。

轻量级控制器如下所示:

public class MyTargetController : Controller
{
    public ActionResult Index(string option)
    { ... }

    public ActionResult FirstAction()
    { ... }

    public ActionResult SecondAction(param list)
    { ... }
}

MyCustomRoute设置为将MyWebsite/MyTarget/randomOption映射到Index操作,并将randomOption作为option参数传递。问题是此路由也捕获了所有其他操作:MyWebsite/MyTarget/FirstActionMyWebsite/MyTarget/SecondAction(忽略缺少参数)映射到Index操作,其名称路由为{{ 1}}参数。

我不想将网址更改为option之类的内容。是否有明确的方法来区分具有一个参数的默认操作和可能具有或不具有参数的其他操作?

编辑:可以实施以下变通方法,平衡优缺点:

  • 除了MyWebsite/MyTarget/Index/randomOption之外的所有操作都可以移动到帮助控制器:创建两个独立的控制器来处理相同的逻辑;
  • 可以创建自定义路由约束,检查参数值是否与现有操作的名称相对应(Index除外):需要一种存储操作名称的方法,并且需要列表为每次向控制器添加新操作时都会更新(反射可能是更好的方法)。

上述所有变通方法都没有优雅,没有任何“特殊”关怀。

0 个答案:

没有答案