【问题标题】:Url.Action is not working with routes specified in controller using route annotationUrl.Action 不适用于控制器中使用路由注释指定的路由
【发布时间】:2016-04-17 01:46:37
【问题描述】:

我有一个如下所示的 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 Template Syntax 与 Kendo Grid ClientTemplate 列一起使用:

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

每一行的链接最终如下所示: '本地主机:9000/123' /admin/users/detail 完全被忽略了...

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,我相信您在这里有所收获。你能在我的帖子底部看到更新吗?
    • 只知道#= Id # 是网格中行的Id 的占位符。我只是根据您的回答弄清楚我的问题是什么。如果你能告诉我为什么,请告诉我。这有效: Url.Action("UserDetails", "Admin", new { id = "#= Id #"}) + "'" +">Details" 而这不: Url.Action(" UserDetails", "Admin") + "/#= Id #'"
    • 第一个 Url.Action("UserDetails", "Admin", new { id = "#= Id #"}) 匹配 users/details/{id} 的路由模板,因为 yo 包含字符串 id 参数,而第二个找不到匹配项。
    • 知道了,所以第二个示例只有在路由声明为 [[Route("users/details")] 并且函数接受 id 参数时才有效。这是正确的吗?
    • 如果您省略 id [Route("users/details")] 或将 id 设为可选,则第二个可能会起作用。 [Route("users/details/{id?}")] 你有它的方式表明id强制
    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多