如何解决如何使用 MVC .NET 路由创建一致的 URL?
我在 .NET Framework 4.8 中运行 ASP.Net MVC 5。由于生成的 URL 不一致,我不断收到 404 错误。例如,在包含在每个页面顶部的 _PageNav.chstml 部分中,我使用以下内容将用户带回主页:@Url.Action("Index",new { controller = "Home" })
。在导航栏中,这会解析为 <a class="navbar-brand" href="/" />
并正常运行。
当我在同一页面上使用相同的 @Url.Action("Index",new { controller = "Home" })
但后来在按钮上时,它会解析为:<a id="doneButton" class="btn btn-secondary px-4" href="https://localhost:44337/smrt/">Done</a>
由于这种不一致,我经常遇到一些问题,即 AJAX JavaScript 对控制器的引用最终会丢失控制器引用,例如 /create
导致 https://localhost:44337/create
而不是 https://localhost:44337/home/create
或 {{1} } 导致 /home/create
而不是 https://localhost:44337/home/home/create
由于安全限制,我也有一些限制;例如,我不能在页面上使用任何 JavaScript,所以我不能在我的 .cshtml 文件中编写 razor 代码,这将导致 JavaScript。我只能使用页面源文件中引用的 JavaScript。
解决方法
@Url.Action("Index","Home")
应该足以完成这项工作,但我注意到有时在更改级别时自定义路由正在发挥作用的一些问题。 Url.Action 例程不会呈现完全限定的 url,有时我发现我必须附加“../”才能导航到不同的控制器结构,当一个控制器的视图对另一个文件夹的视图进行 AJAX 调用时。此外,默认 URL 结构可能会丢弃相对 URL 调用,因为默认实现是在 URL 结构中隐藏 /Index。所以网址:
- 本地主机/站点(默认主页/索引)
- localhost/site/other(默认索引)
在不同的文件夹结构中看到两个视图,URL 导航可能会被抛弃。
这就是我的经验,为什么您可能会看到您所看到的一些问题。
,这需要一些不同的想法,但我能够解决我的问题。现在,我每次都能以我需要的方式获得一致的 URL。
首先,我使用这篇文章 How to Build Absolute Action URLs Using the UrlHelper Class,使用基于 UrlHelper 类的扩展方法创建以下类。
using System.Web.Mvc;
namespace MVCPages.Utilities
{
public static class UrlHelperExtenions
{
/// <summary>
/// Generates a fully qualified URL to an action method by using
/// the specified action name,controller name and route values.
/// </summary>
/// <param name="url">The URL helper.</param>
/// <param name="actionName">The name of the action method.</param>
/// <param name="controllerName">The name of the controller.</param>
/// <param name="routeValues">The route values.</param>
/// <returns>The absolute URL.</returns>
public static string AbsoluteAction(
this UrlHelper url,string actionName,string controllerName,object routeValues = null
)
{
var httpContext = url.RequestContext.HttpContext;
string scheme = httpContext.Request.Url.Scheme;
return url.Action(
actionName,controllerName,routeValues,scheme
);
}
}
}
无论站点部署在何处,这种新方法都会动态地为我提供网站的根目录。
然后我在需要 URL 一致性的视图中调用新方法扩展,并使用 ViewBag 将绝对根 URL 传递给视图。
public ActionResult Index()
{
string rootUrl = Url.AbsoluteAction("Index","Smrt");
ViewBag.RootUrl = rootUrl;
}
因为我不允许使用 Razor 创建 JavaScript,所以接下来我使用 Razor 创建一个隐藏的 HTML div 标签,其中包含根 URL <div id="rootUrl">https://rooturl.com/</div>
现在,在 JavaScript 中,我使用 DOM 从 HTML 标签中检索 URL;然后在我的 ajax 调用中使用 ad 为 AJAX 调用创建一个完整的 URL。
window.onload = function () {
var rootUrl = document.getElementById("rootUrl").innerHTML;
var ajaxUrl = rootUrl + ajaxCall;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。