【问题标题】:Get the virtual path of an action from outside the controller从控制器外部获取动作的虚拟路径
【发布时间】:2019-11-01 07:55:50
【问题描述】:

我正在使用面向 .NET 框架 4.6.1 的 ASP.NET MVC 5.2.7。

从内部,比如一个业务对象,而不是从控制器或视图中,我如何获取虚拟路径,即操作的完整 url。

这样:

"~/Action/Controller/param"

变成

"/Action/Controller/param"

为什么?

对于那些想知道有什么大不了的人,我为什么不只是 删除前导波浪号 (~) 字符,两条路径(带有 和没有波浪号的)可能会有所不同,如果您的 web应用没有部署在站点根目录下。

例如你有一个映射到domain.com/foo 的网站。那么你 想"~/Controller/Action"返回/foo/Controller/Action

例如

class MyBusinessObject
{
  public void DoSomething()
  {
    // From here, what do I do such that
    // "~/Controller/Action/param" becomes
    // /Controller/Action/param
    // without doing it by hand
  }
}

class MyController : Mvc.Controller
{
  public ActionResult SomeAction()
  {
    new MyBusinessObject().DoSomething();

    ...

    return View();
  }
}

MVC 或 .NET 框架库中是否已有方法?

换句话说,如果我可以从控制器外部调用Url.Content() 扩展,那就可以了。

我以前做过很多次,但我总是会忘记并发布一个关于它的问题。但我找不到我之前关于这个的问题。

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc


    【解决方案1】:

    好的,我刚在问题中写下“如果我可以拨打Url.Helper”就突然想起来了。

    即使UrlHelper 类的Content 方法是公共的,您也不能像这样从Controller 外部使用它:

    class BusinessObject
    {
      void DoSomething()
      {
        var url = System.Web.Mvc.UrlHelper.Content("~/Controller/Action/param");
      }
    }
    

    因为它在内部调用了另一个方法,像这样将HttpContext obejct 传递给它:

    public virtual string Content(string contentPath)
    {
        return GenerateContentUrl(contentPath, RequestContext.HttpContext);
    }
    

    但是,它调用的 GenerateContentUrl 方法也是 public。而且它也是static,所以不需要创建UrlHelper 对象。所以,我们可以这样称呼它:

    var virtualPath = System.Web.Mvc.UrlHelper.GenerateContentUrl(
                       "~/Action/Controller/Param", 
                       new HttpContextWrapper(HttpContext.Current));
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多