C# Url.Action无法使用路由批注处理控制器中指定的路由
我有一个AdminController,如下所示:C# Url.Action无法使用路由批注处理控制器中指定的路由,c#,asp.net-core,asp.net-core-mvc,asp.net-core-routing,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Routing,我有一个AdminController,如下所示: AdminController[路由(“管理员”)] Index()(所有管理内容的登录页) UserIndex()-[Route(“users”)] UserDetails()-[Route(“users/details/{id}”)] RoleIndex()-[Route(“roles”)] RoleDetails()-[Route(“roles/details/{id}”)] 这些等同于以下URL模式: 管理员/用户 管理员/用户/详细信
AdminController[路由(“管理员”)]
Index()(所有管理内容的登录页)
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”)
时才有效,因为它没有路由标签
更新:
我正在尝试与剑道网格ClientTemplate列一起使用:
columns.Bound(c => c.Id).ClientTemplate(
"<a href='" +
Url.Action("UserDetails", "Admin") +
"/#= Id #'" +
">Details</a>"
);
columns.Bound(c=>c.Id).ClientTemplate(
""
);
每行的链接结果如下所示:
'本地主机:9000/123'
正在完全忽略/admin/users/detail
下面是我在AdminController中尝试调用的方法的确切声明:
// GET: Users/Details/5
[Route("users/details/{id}")]
public async Task<IActionResult> UserDetails(string id)
{
}
//GET:Users/Details/5
[路由(“用户/详细信息/{id}”)]
公共异步任务用户详细信息(字符串id)
{
}
重新检查控制器的路线和操作
[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}是用户id
。因此,当请求Url.Action(“UserDetail”、“Admin”)
时,没有任何匹配项
Url.Action("UserDetail", "Admin", new { id = "1" })
您可以通过更新路线使id
参数成为可选参数
[Route("users/details/{id?}")]
这将允许用户/详细信息工作。但是id
参数的值将默认为null
它只有在执行Url.Action(“Index”,“Admin”)
时才有效,因为它没有路由标记
它只适用于Url.Action(“Index”,“Admin”)
,因为默认情况下约定与Index匹配。hmm我相信您在这里了解到了一些东西。你能看到我文章底部的更新吗?只需知道#=Id是网格中行Id的占位符。根据你的回答,我才知道我的问题是什么。如果你能告诉我原因,请告诉我。这是有效的:Url.Action(“UserDetails”,“Admin”,new{id=“#=id#”})+“““+”>Details”,而这不是:Url.Action(“UserDetails”,“Admin”)+“/#=id#””第一个Url.Action(“UserDetails”,“Admin”,new{id=“#=id#”})匹配用户/Details/{id}的路由模板
因为您包含了字符串id
参数,但没有找到第二个参数的匹配项。明白了,所以第二个示例只有在路由声明为[[route(“users/details”)]并且函数接受id参数时才起作用。这是否正确?如果省略id
[route(“users/details”)],第二个示例可能起作用或者将id
设置为可选。[Route(“users/details/{id?}”)]
您使用的方式表明id
是强制性的