如何生成URL?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成URL?相关的知识,希望对你有一定的参考价值。

参考技术A 点击页面中的链接,浏览器会根据源码中相对URL路径作不同的处理:

(1)有协议名称,但没有域名信息

  对于这种形式的URL,它的协议,路径,查询字符串和片段ID都以它自身为准,但域名信息的部分,以引用它的那个页面地址为准。

(2)没有协议名,但有域名信息

  协议名称由原发起页面确定,而所有接下来的URL信息都取自这个相对URL,构成完整的URL。

(3)没有协议名,没有域名信息,但有路径

  如果网页中明确给出了base标签, 那么得到的URL是 base URL +路径。

  如果没有给出base标签,这种情况下分为两种结果:

  a) 如果相对URL的开头是斜杠(根目录),则忽略当前页面自身的URL信息,直接把相对路径拼在当前页面的域名后面。

  b) 如果相对URL的开头不是斜杠,则将当前页面URL的最后一个/之后的内容去掉,将剩余的内容返回作为base URL,相对路径拼接在其后。

(4)没有协议名,没有域名信息,没有路径,但有查询字符串

  协议,域名,路径信息全部原封不动的从原引用URL复制过来,查询字符串和片段ID则来自相对URL。

(5)只有fragment

  只替换fragment部分,其他所有信息从原引用URL复制过来。

<base>标签

  浏览器会从当前页面的 UR中提取相应的部分来填写相对 URL 中的空白。使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。

  浏览器也会在当前页面URL的基础上对..和.进行相应调整,在地址栏生成新的请求URL。

如何使用 Url.Action 到达控制器并生成 url

【中文标题】如何使用 Url.Action 到达控制器并生成 url【英文标题】:How to use Url.Action to get to the controller and also generate the url 【发布时间】:2022-01-08 22:34:52 【问题描述】:

使用此按钮时

<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。谢谢。 【参考方案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,也可以在此处查看解决方法:***.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();

【讨论】:

以上是关于如何生成URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用index.php生成Laravel 4 URL?

如何生成 blob url?

Rails - 如何将生成的 URL 修复为友好的 URL

(转)秒杀系统中如何动态生成下单随机URL

如何使用 Python 使用动态生成的 URL 抓取页面?

如何在 Django 中自动生成 URL