Url.Action不使用路径注释在控制器中指定的路由

时间:2016-04-17 01:46:37

标签: c# asp.net-core asp.net-core-mvc asp.net-core-routing

我有一个如下所示的AdminController:

AdminController [Route("admin")]

Index() (landing page for all administrative content)

UserIndex() - [Route("users")]
UserDetails() - [Route("users/details/{id}")]

RoleIndex() - [Route("roles")]
RoleDetails() - [Route("roles/details/{id}")]

这些与以下网址格式相同:

管理员/用户
管理员/用户/信息/ 1

但是,如果我尝试在我的视图中执行以下操作,则无效:

Url.Action("UserDetail", "Admin")

这不应该足够智能输出:' / admin / users / details'?

仅当我执行Url.Action("Index", "Admin")时才有效,因为没有路径标记。

更新

我正在尝试将Kendo Template Syntax与Kendo Grid ClientTemplate列一起使用:

    columns.Bound(c => c.Id).ClientTemplate(
        "<a href='" +
            Url.Action("UserDetails", "Admin") +
            "/#= Id #'" +
        ">Details</a>"
    );

每行的链接最终如下所示: &#39;本地主机:一百二十三分之九千&#39; / admin / users / detail完全被忽略......

这是我在AdminController中尝试调用的方法的确切声明:

// GET: Users/Details/5
[Route("users/details/{id}")]
public async Task<IActionResult> UserDetails(string id)
{
}

1 个答案:

答案 0 :(得分:3)

重新检查控制器的路由和操作

[Route("admin")]
public class AdminController : Controller {
    // GET admin
    [Route("")]
    public IActionResult Index() {...}

    //GET admin/users
    [Route("users")]
    public IActionResult UserIndex() {...}

    //GET admin/users/details/1
    [Route("users/details/{id}")]
    public IActionResult UserDetails(string id) {...}

    //GET admin/roles 
    [Route("roles")]
    public IActionResult RoleIndex() {...}

    //GET admin/roles/details/1
    [Route("roles/details/{id}")]
    public IActionResult RoleDetails(string id) {...} 

}
  

这不应该足够聪明输出:'/ admin / users / details'?

根据您的路线设置/admin/users/details不存在。

等待/admin/users/details/{id}的请求,其中{id}是userid。因此,当请求Url.Action("UserDetail", "Admin")时,没有什么可匹配的。

Url.Action("UserDetail", "Admin", new { id = "1" })

您可以通过更新路径

使id参数成为可选参数
[Route("users/details/{id?}")]

这将允许users/details工作。但id参数的值将默认为null

  

仅当我Url.Action("Index", "Admin")时才有效,因为没有路标标记

它仅适用于Url.Action("Index", "Admin"),因为约定默认匹配Index。