C# MVC5:将两个不同的URL路由到一个操作方法中,通过输入参数指定它们
让我们假设我有以下操作方法:C# MVC5:将两个不同的URL路由到一个操作方法中,通过输入参数指定它们,c#,asp.net-mvc-5,asp.net-mvc-routing,url-routing,C#,Asp.net Mvc 5,Asp.net Mvc Routing,Url Routing,让我们假设我有以下操作方法: [Route("option/{id:int}")] // routing is incomplete public ActionResult GetOption(int id, bool advanced) { ... return View(); } 此操作应与两个不同的路由关联: 以简单形式获取结果的方法:../option/{id} 及其高级版本:../option/{id}/advanced 重要的是将这些路由表示为两个独立的URL,
[Route("option/{id:int}")] // routing is incomplete
public ActionResult GetOption(int id, bool advanced)
{
...
return View();
}
此操作应与两个不同的路由关联:
- 以简单形式获取结果的方法:
../option/{id}
- 及其高级版本:
../option/{id}/advanced
问题是:如何设置这样的路由?如果您能够更改第二个参数的类型
[HttpGet]
[Route("option/{id:int}")] // GET option/1
[Route("option/{id:int}/{*advanced}")] // GET option/1/advanced
public ActionResult GetOption(int id, string advanced) {
bool isAdvanced = "advanced".Equals(advanced);
//...
return View();
}
尽管您习惯于单独执行操作,但您可以简化一个调用另一个,以避免重复代码(DRY)
您愿意更改第二个参数的类型吗?@Nkosi,我更愿意将其视为布尔标志,因为它在这种情况下更有意义。但是如果没有办法绑住一个箱子。。。您想推荐一个字符串吗?第二个解决方案很明显,但它不符合要求。这两条路线都必须采用单动作方法。至于第一个解决方案——它正在工作,非常感谢,尽管我不想改变指示符的类型。也许您有其他想法如何在不修改动作签名的情况下实现这一点?
// GET option/1
[HttpGet]
[Route("option/{id:int}")]
public ActionResult GetOption(int id, bool advanced = false) {
//...
return View("Option");
}
// GET option/1/advanced
[HttpGet]
[Route("option/{id:int}/advanced")]
public ActionResult GetAdvancedOption(int id) {
return GetOption(id, true);
}