假设我已经定义了这样的路线,
context.MapRoute(
"Preview",
"/preview/{id}/{type}",
new { controller = "Preview", action = "Invoice", id = UrlParameter.Optional, type = UrlParameter.Optional }
);
我有带动作发票的控制器
public ActionResult(int id, string type)
{
if (type == "someType")
{
// ...
}
else
{
// ..
}
}
我想摆脱动作中的If-Else案例。是否有可能以某种方式归因于动作,因此ASP.MVC将区分两者,例如:
只是一个假想法?
[HttpGet, ActionName("Action"), ForParameter("type", "someType")]
public ActionResult PreviewSomeType(int id) {}
[HttpGet, ActionName("Action"), ForParameter("type", "someType2")]
public ActionResult PreviewSomeType2(int id) {}
在MVC2 / 3中是否可以这样?
答案 0 :(得分:4)
您需要的是一个动作方法选择器,它完全按照您所描述的内容执行完全用于此目的,因此这不是一种解决方法,因为它将使用不同的路由定义或任何其他方式。自定义操作方法选择器属性解决方案不是解决方法。
我写过两篇博文,可以帮助您开始使用Asp.net MVC中的操作方法选择以及这些属性:
答案 1 :(得分:0)
我认为这就是路由的用途。 只需将您的单条路线分成两部分:
context.MapRoute(null, "preview/{id}/SomeType",
new {
controller = "Preview",
action = "Action1",
id = UrlParameter.Optional,
}
);
context.MapRoute(null, "preview/{id}/SomeOtherType",
new { controller = "Preview",
action = "Action2",
id = UrlParameter.Optional,
}
);
或者更一般,使用最后一个段作为操作名称:
context.MapRoute(null, "preview/{id}/{action}",
new { controller = "Preview",
id = UrlParameter.Optional,
}
);
但我认为,可选段必须出现在最后。那么为什么不使用默认路由模式
controller/action/id