如何在 ASP.NET MVC 中的控制器之外生成 URL?

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中的控制器之外生成 URL?【英文标题】:How do I generate a URL outside of a controller in ASP.NET MVC? 【发布时间】:2011-02-05 15:01:23 【问题描述】:

如何从控制器外部的辅助方法生成指向控制器操作的 URL?

【问题讨论】:

ASP.NET MVC - Accessing Url.GenerateUrl from Outside the Controller 的可能重复项 我假设您也不是在谈论 View 的 UrlHelper? 没有一个答案是真正的答案 【参考方案1】:

如果您可以访问HttpContext,则可以使用以下内容:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

【讨论】:

这应该是正确的答案。只是将对象传递给方法(当前正确答案)有点太明显了,并且不是 UrlHelper 特定的。 能够通过注入(Autofac)提供以下行; builder.Register(context => new UrlHelper(context.Resolve<RequestContext>())).InstancePerRequest(); 值得一提的是使用System.Web.Mvc命名空间而不是System.Web.Http.Routing,因为这个类存在于这两个命名空间中【参考方案2】:

您可以使用 LinkGenerator 。它是 Microsoft.AspNetCore.Routing 命名空间中的新功能,已于 2020 年 8 月添加。

首先你必须在你的课堂上注入它:

public class Sampleervice 

        private readonly LinkGenerator _linkGenerator;

        public Sampleervice (LinkGenerator linkGenerator)
       
            _linkGenerator = linkGenerator;
       

       public string GenerateLink()
        
             return _linkGenerator.GetPathByAction("Privacy", "Home");
       

更多信息请查看this

【讨论】:

【参考方案3】:

使用 L01NL 的答案,可能需要注意的是,如果提供了一个,Action 方法也将获取当前参数。例如:

编辑 id = 100 的项目 网址是http://hostname/Project/Edit/100

urlHelper.Action("Edit", "Project") 返回http://hostname/Project/Edit/100

urlHelper.Action("Edit", "Project", new id = (int?) null ); 返回http://hostname/Project/Edit

【讨论】:

【参考方案4】:

由于您可能想在视图中使用该方法,您应该使用视图的Url 属性。它是UrlHelper 类型的,它允许你做

<%: Url.Action("TheAction", "TheController") %>

如果您想在视图中避免这种字符串引用,您可以在 UrlHelper 上编写扩展方法来为您创建它:

public static class UrlHelperExtensions

    public static string UrlToTheControllerAction(this UrlHelper helper)
    
        return helper.Action("TheAction", "TheController");
    

会这样使用:

<%: Url.UrlToTheControllerTheAction() %>

【讨论】:

【参考方案5】:

将 UrlHelper 传递给您的辅助函数,然后您可以执行以下操作:

public SomeReturnType MyHelper(UrlHelper url, // your other parameters)

   // Your other code

   var myUrl =  url.Action("action", "controller");

  // code that consumes your url

【讨论】:

嗯,如果你已经有了UrlHelper,为什么还要调用这个方法呢? @hunter:OP 有一个助手,他需要那个助手中的 url,我建议将 UrlHelper 传递给他的助手以生成他想要的 url。我编辑了我的答案,以更清楚地说明我要提出的建议。 我不能从静态类或 asp.net mvc 中内置的东西访问 UrlHelper 吗?不通过 UrlHelper。 对实现没有用处,例如,模型类中的只读 Url 属性。

以上是关于如何在 ASP.NET MVC 中的控制器之外生成 URL?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 5 MVC6 中标签助手和路由属性之间的奇怪行为

了解 ASP.NET(MVC、Web API)中的令牌生成/验证

在 sql asp.net mvc 5 中使用 linq 时如何格式化记录中的数据?

ASP.Net MVC 中的简单 Dropzone 实现 - 如何在控制器中获取数据?

在 ASP.NET MVC 中动态生成 Javascript、CSS

将修改后的表发送到 ASP.NET MVC 中的控制器?