ASP.NET属性路由 - Url.Action无法正常工作

时间:2017-11-28 01:24:40

标签: asp.net asp.net-mvc-routing

此代码可以正常工作:

[RouteArea("Main", AreaPrefix = "Hello")]
[RoutePrefix("{orgCode}")]
public class ResponseController : BaseController {
  [Route("Save/{formCode}/{responseId}")]
  public ActionResult Save(string formCode, int responseId, string questionCode){}
}
例如,

Url.Action("Save", "Response")会产生/Hello/org123/Save/form/123

但是,如果更改了Route属性并添加了另一个段:

  [Route("Save/{formCode}/{responseId}/{questionCode}")]

然后Url.Action("Save", "Response")产生一个空字符串。

路线中可以定义多少部分是否有限制?

1 个答案:

答案 0 :(得分:0)

  

路线中可以定义多少部分是否有限制?

没有

但是MVC只能使用它知道的路由值来构建URL。这可以是传递Url.Action()方法的路由值和当前请求中的值(通常通过当前URL传递)的组合。

当框架尝试确定要使用的路由时,它会选择与所有路由值匹配的第一个路径 (控制器,操作和其他任何内容)和匹配所有(可选)约束。

如果以下所有条件对于任何参数均为真,则路线将不匹配

  1. 没有默认值
  2. 未标记UrlParameter.Optional(注意:可选参数可能没有任何非可选参数)
  3. 当前请求中不存在
  4. 未明确作为路由值传递给Url.Action()(或其他调用UrlHelper以生成网址的方法)
  5. 具有不匹配的约束规则
  6. 简而言之,只有提供了所有必需参数并满足约束条件时,路径才会匹配。

    因此,显然当前上下文中没有questionCode,并且由于需要构建URL,因此您将获得一个空字符串。很可能你需要明确地传递它。

    Url.Action("Save", "Response", new { questionCode = "123" })
    

    如果网址中不存在其他参数,您还应该小心谨慎地传递其他参数。