微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 MVC .NET 路由创建一致的 URL?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。