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

C# 如何在ASP.NET MVC中的控制器外部生成URL?,c#,asp.net-mvc,asp.net-mvc-3,controller,html-helper,C#,Asp.net Mvc,Asp.net Mvc 3,Controller,Html Helper,如何从控制器外部的助手方法生成指向控制器操作的URL?将UrlHelper传递给助手函数,然后您可以执行以下操作: public SomeReturnType MyHelper(UrlHelper url, // your other parameters) { // Your other code var myUrl = url.Action("action", "controller"); // code that consumes your url } 由于您可能希

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

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

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

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

  // code that consumes your url
}

由于您可能希望在视图中使用该方法,因此应该使用视图的
Url
属性。它的类型为
UrlHelper
,允许您执行以下操作

<%: Url.Action("TheAction", "TheController") %>
这将是这样使用的:

<%: Url.UrlToTheControllerTheAction() %>

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

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

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

编辑id为100的项目 Url是
http://hostname/Project/Edit/100

urlHelper.Action(“编辑”、“项目”)
返回
http://hostname/Project/Edit/100

urlHelper.Action(“编辑”,“项目”,新的{id=(int?)null})

返回
http://hostname/Project/Edit

您可以使用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");
       }
}

有关更多信息,请检查

可能的重复项,我假设您也不是在谈论视图的UrlHelper?没有一个答案是真正的答案。嗯,如果您已经有UrlHelper,为什么要调用此方法?@hunter:OP有一个helper,他需要该helper中的url,我建议将UrlHelper传递给他的助手,以生成他想要的url。我编辑了我的答案,以便更清楚地说明我的建议。我不能从静态类或asp.net mvc内置的东西访问UrlHelper吗?不传递UrlHelper。对于实现来说没有用处,例如,模型类中的只读Url属性。这应该是正确的答案。只需将对象传递到方法(当前正确答案)有点太明显,并且不是UrlHelper特定的<代码>生成器.Register(上下文=>新的UrlHelper(上下文.Resolve()).InstancePerRequest()
值得一提的是使用
System.Web.Mvc
命名空间,而不是
System.Web.Http.Routing
,因为此类存在于这两个命名空间中
public class Sampleervice 
{
        private readonly LinkGenerator _linkGenerator;

        public Sampleervice (LinkGenerator linkGenerator)
       {
            _linkGenerator = linkGenerator;
       }

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