【问题标题】:How to use Url.Action to get to the controller and also generate the url如何使用 Url.Action 到达控制器并生成 url
【发布时间】:2023-03-27 23:13:02
【问题描述】:

使用此按钮时

<a onclick="location.href='@Url.Action("Update", "Book", new { id = @Model.Id })'"
               class="btn btn-primary">Edit</a>

控制器确实点击了get方法

[HttpGet]
[Route("{id}")]
public ActionResult Update(int id) {...}

但是 Url 不再匹配路由 {controller}/{action},它只是显示这样的 id

https://localhost:44345/1

【问题讨论】:

  • 嗨@georgebreje,请在下面查看我的答案。如果我的回答可以帮助您解决问题,您能接受吗?如果没有,你能跟进让我知道吗?参考:How to accept as answer。谢谢。

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


【解决方案1】:

当您在端点上使用 [Route()] 属性时,您将覆盖整个路由,这就是删除控制器名称部分的原因。我想您这样做的原因是与现有的 GET 操作发生冲突。

您似乎正在使用 GET 请求来更新您的实体。而是根据场景 (https://www.w3schools.com/tags/ref_httpmethods.asp) 使用 POSTPUT 并相应地更新您的 HttpGet 属性。

[HttpPost]
// or
[HttpPut]

但是,XHTML 1.x 表单仅支持将 GETPOST 作为 HTTP 请求方法。您可以使用 POST,也可以查看解决方法 here,如果您想使用 PUT

此外,请确保您的控制器类上具有如下所示的路由属性:

[Route("[controller]")]
public class BookController : ControllerBase

这将确保包含路由的控制器部分,因此格式为:.../{controllerName}/{id}

注意:如果您想坚持使用 GET 并且有多个相同 HTTP 消息类型的请求,那么您可以通过更新 [HttpGet] 来路由到正确的操作属性而不是添加 [Route] 属性:

[HttpGet("update/{id}")]

这将为您的网址提供以下格式.../{controllerName}/update/{id}

【讨论】:

  • 没有
  • HTML 表单目前仅支持 GET 和 POST 作为 HTTP 请求方法。您可以使用 POST,也可以在此处查看解决方法:stackoverflow.com/a/8054241/9328542 如果您想使用 PUT
【解决方案2】:

你可以使用 ancor 助手

<a asp-action="Update" asp-controller="Book" asp-route-id="@Model.Id" class="btn btn-primary">Edit</a>

【讨论】:

    【解决方案3】:

    如果你使用Route属性,它将覆盖路由模板。

    所以如果你使用 ASP.NET Core MVC,你需要使用如下的路由模板:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
    });
    

    你的控制器应该是:

    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,控制器应如下所示:

    [Route("[controller]/[action]")]
    [ApiController]
    public class BookController : ControllerBase
    {
    
        [HttpGet]
        [Route("{id}")]
        public ActionResult Update(int id) => Ok();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2016-11-12
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多