如何生成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) 使用 POST 或 PUT 并相应地更新您的 HttpGet 属性。
[HttpPost]
// or
[HttpPut]
但是,XHTML 1.x 表单仅支持将 GET 和 POST 作为 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?的主要内容,如果未能解决你的问题,请参考以下文章