【问题标题】:aspnetcore routing to controller action with custom routeaspnetcore 使用自定义路由路由到控制器操作
【发布时间】:2020-11-27 18:21:15
【问题描述】:

我有一个控制器“ServicesController”,其操作“编辑”采用一个字符串参数“serviceId”。

此控制器已应用如图所示的路由并按预期工作。

[Route("Services/Edit/{id}")]
public async Task<IActionResult> EditService(string id)
{
    Service s = await _servicesService.GetService(id);
    return View("EditService", s);
}

当我尝试从另一个操作重定向到此路由时,我只能获取显示为查询的值

return RedirectToAction("Edit", new { id = s.Id });
// redirects to /Services/Edit?id=exampleid

我搜索了一些相关的答案,人们问了同样的问题,但建议的解决方案对我不起作用,可能是因为我的操作中有路线装饰?

我也尝试过以下方法,但会重定向到带有 id 的调用操作

[Route("Services/Foo/{serviceId}")]
public async Task<IActionResult> Foo(string serviceId)
{
    // redirects to /Services/Foo/exampleid
    return RedirectToRoute("Edit", serviceId);
}

我哪里错了?

【问题讨论】:

  • [FromRoute]放在参数前面有用吗? EditService([FromRoute] string id)

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


【解决方案1】:

RedirectToAction 的第一个参数是actionName,它是方法的名称,在我们的例子中应该是EditService。这是docs 的链接。所以,我认为正确的版本应该是这样的:

return RedirectToAction("EditService", new { id = s.Id });

它还有一个重载版本RedirectToAction(string actionName, string controllerName, object routeValues),它允许指定控制器,以防你不在同一个控制器内重定向。

关于RedirectToRoute,它接受路由的名称,为此我们需要为EditService(string id) 操作设置名称,如下所示:

[Route("Services/Edit/{id}", Name = "MyEditServiceRoute")]
public async Task<IActionResult> EditService(string id)
{
    ...
}

...

{
    ...
    return RedirectToRoute("MyEditServiceRoute", serviceId);
}

【讨论】:

  • 我知道这可能是一个愚蠢的错误,谢谢你的帮助?
【解决方案2】:

代替:

return RedirectToAction("Edit", new { id = s.Id });

试试:

return EditService( s.Id );

【讨论】:

    【解决方案3】:

    使用路线上的“名称”属性尝试使用明确的路线名称。

    [Route("Services/Edit/{id}", Name="EditService")]
    

    然后在重定向中提供该特定名称:

    return RedirectToAction("EditService", new { id = s.Id });
    

    【讨论】:

    • 而 ochzhen 以 5 秒的优势击败了我。 ;)
    猜你喜欢
    • 2012-06-19
    • 2011-12-03
    • 1970-01-01
    • 2011-11-24
    • 2011-05-09
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多