MVC5:将两个不同的URL路由到一个动作方法,通过输入参数指定它们

时间:2017-02-28 18:42:09

标签: c# asp.net-mvc-5 asp.net-mvc-routing url-routing

我们假设我有以下行动方法:

TouchableOpacity

此操作应与两个不同的路径相关联:

  • 以简单形式提取结果的那个:[Route("option/{id:int}")] // routing is incomplete public ActionResult GetOption(int id, bool advanced) { ... return View(); }
  • 及其高级版本:.../option/{id}

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

问题是:如何设置此类路由?

1 个答案:

答案 0 :(得分:1)

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

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

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