[英]How to use Url.Action to get to the controller and also generate the url
使用此按钮时
<a onclick="location.href='@Url.Action("Update", "Book", new { id = @Model.Id })'"
class="btn btn-primary">Edit</a>
controller 确实达到了 get 方法
[HttpGet]
[Route("{id}")]
public ActionResult Update(int id) {...}
但是 Url 不再匹配路由 {controller}/{action},它只是显示像这样的 id
https://localhost:44345/1
当您在端点上使用 [Route()] 属性时,您将覆盖整个路由,这就是删除 controller 名称部分的原因。 我想您这样做的原因是与现有的GET操作发生冲突。
您似乎正在使用GET请求来更新您的实体。 而是根据场景使用POST或PUT ( https://www.w3schools.com/tags/ref_httpmethods.asp )并相应地更新您的HttpGet属性。
[HttpPost]
// or
[HttpPut]
并确保您的 controller class 具有如下所示的路由属性:
[Route("[controller]")]
public class BookController : ControllerBase
这将确保包含路线的 controller 部分,因此格式为: .../{controllerName}/{id}
注意:如果您想坚持使用GET并有多个相同 HTTP 消息类型的请求,那么您可以通过更新 [HttpGet] 属性而不是添加 [Route] 属性来路由到正确的操作:
[HttpGet("update/{id}")]
这将为您的 url 提供以下格式.../{controllerName}/update/{id}
你可以使用 ancor 助手
<a asp-action="Update" asp-controller="Book" asp-route-id="@Model.Id" class="btn btn-primary">Edit</a>
如果您使用Route
属性,它将覆盖路由模板。
所以如果你使用 ASP.NET Core MVC,你需要使用如下的路由模板:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
您的 Controller 应该是:
public class BookController : Controller
{
[HttpGet]
public ActionResult Update(int id) {
return View();
}
}
然后 Url.Action 应该按预期工作: https://localhost:44345/Book/Update/1
<a onclick="location.href='@Url.Action("Update", "Book", new { id = @Model.Id })'"
class="btn btn-primary">Edit</a>
如果您使用 ASP.NET Core WebApi,controller 应该如下所示:
[Route("[controller]/[action]")]
[ApiController]
public class BookController : ControllerBase
{
[HttpGet]
[Route("{id}")]
public ActionResult Update(int id) => Ok();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.