aspnetcore 使用自定义路由路由到控制器操作
aspnetcore routing to controller action with custom route
我有一个控制器“ServicesController”,其操作“Edit”采用一个字符串参数“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);
}
我哪里出错了?
而不是:
return RedirectToAction("Edit", new { id = s.Id });
尝试:
return EditService( s.Id );
RedirectToAction
的第一个参数是actionName
,它是方法的名称,在我们的例子中应该是EditService
。这里有一个link到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);
}
尝试使用路由上的“名称”属性明确命名路由。
[Route("Services/Edit/{id}", Name="EditService")]
然后在重定向中提供该特定名称:
return RedirectToAction("EditService", new { id = s.Id });
我有一个控制器“ServicesController”,其操作“Edit”采用一个字符串参数“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);
}
我哪里出错了?
而不是:
return RedirectToAction("Edit", new { id = s.Id });
尝试:
return EditService( s.Id );
RedirectToAction
的第一个参数是actionName
,它是方法的名称,在我们的例子中应该是EditService
。这里有一个link到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);
}
尝试使用路由上的“名称”属性明确命名路由。
[Route("Services/Edit/{id}", Name="EditService")]
然后在重定向中提供该特定名称:
return RedirectToAction("EditService", new { id = s.Id });