Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Url.Action无法使用路由批注处理控制器中指定的路由_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core Routing - Fatal编程技术网

C# Url.Action无法使用路由批注处理控制器中指定的路由

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,如下所示:

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
是强制性的