我有一个带有多个动作的控制器,我设置了以下路线:
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/FirstAction
和MyWebsite/MyTarget/SecondAction
(忽略缺少参数)映射到Index
操作,其名称路由为{{ 1}}参数。
我不想将网址更改为option
之类的内容。是否有明确的方法来区分具有一个参数的默认操作和可能具有或不具有参数的其他操作?
编辑:可以实施以下变通方法,平衡优缺点:
MyWebsite/MyTarget/Index/randomOption
之外的所有操作都可以移动到帮助控制器:创建两个独立的控制器来处理相同的逻辑; Index
除外):需要一种存储操作名称的方法,并且需要列表为每次向控制器添加新操作时都会更新(反射可能是更好的方法)。上述所有变通方法都没有优雅,没有任何“特殊”关怀。