繁体   English   中英

如何使用 Z02A3A357710CC2A5DDFFB74ED012FB59Z.Action 到达 controller 并生成 url

[英]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请求来更新您的实体。 而是根据场景使用POSTPUThttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM