Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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# MVC5:将两个不同的URL路由到一个操作方法中,通过输入参数指定它们_C#_Asp.net Mvc 5_Asp.net Mvc Routing_Url Routing - Fatal编程技术网

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
重要的是将这些路由表示为两个独立的URL,而不是带有可选查询字符串参数的同一URL。这些URL之间的唯一区别在于最后一个术语,它基本上是某种形式的指定。我需要的是一种设置路由规则的方法,告诉框架它应该为两种类型的请求调用相同的方法,如果是“高级”请求,则将true作为第二个参数传递,否则将为false。我需要将这两个路由封装到一个操作方法中有很多原因。所以,不,我不能添加第二种方法来单独处理“高级”请求


问题是:如何设置这样的路由?

如果您能够更改第二个参数的类型

[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);
}