3

我有一个如下所示的 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}")]

这些等同于以下 URL 模式:

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

但是,如果我尝试在我看来执行以下操作,则它不起作用:

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

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

它只有在我这样做时才有效,Url.Action("Index", "Admin")因为它没有路由标签。

更新:

我正在尝试将Kendo 模板语法与 Kendo Grid ClientTemplate 列一起使用:

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

每行的链接最终如下所示: 'localhost:9000/123' /admin/users/detail 完全被忽略...

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

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

1 回答 1

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")因为约定默认匹配索引。

于 2016-04-17T03:36:46.233 回答