ASP.Net:在共享/静态函数中使用 System.Web.UI.Control.ResolveUrl()

ASP.Net: Using System.Web.UI.Control.ResolveUrl() in a shared/static function

提问人:travis 提问时间:8/26/2008 更新时间:2/28/2020 访问量:23863

问:

在 Asp.Net 的共享/静态函数中使用 ResolveUrl() 的最佳方法是什么?我目前对 VB.Net 的解决方案是:

Dim x As New System.Web.UI.Control
x.ResolveUrl("~/someUrl")

或 C#:

System.Web.UI.Control x = new System.Web.UI.Control();
x.ResolveUrl("~/someUrl");

但我意识到这不是最好的称呼方式。

C# asp.net vb.net 静态 ResolveURL

评论


答:

48赞 Dave Ward 8/26/2008 #1

我使用 System.Web.VirtualPathUtility.ToAbsolute

3赞 Keith 8/26/2008 #2

我倾向于使用 HttpContext.Current 来获取页面,然后运行任何页面/Web 控制方法。

23赞 jdw 2/9/2009 #3

值得注意的是,尽管 System.Web.VirtualPathUtility.ToAbsolute 在这里非常有用,但它并不是 Control.ResolveUrl 的完美替代品。

至少有一个显著的区别:Control.ResolveUrl 可以很好地处理查询字符串,但它们会导致 VirtualPathUtility 引发 HttpException。这在第一次发生时绝对是令人困惑的,特别是如果您习惯了 Control.ResolveUrl 的工作方式。

如果您知道要使用的查询字符串的确切结构,则很容易解决,即:

public static string GetUrl(int id)
{
    string path = VirtualPathUtility.ToAbsolute("~/SomePage.aspx");
    return string.Format("{0}?id={1}", path, id);
}

...但是,如果查询字符串是从未知来源传入的,那么您将需要以某种方式解析它。(在深入研究之前,请注意 System.Uri 可能能够为您完成此操作)。

评论

0赞 Michael Kropat 9/16/2016
这可能不再是真的了。在 .NET 4 中,当我评估时,我得到VirtualPathUtility.ToAbsolute("~/bar/baz?qux=123&quux=456", "/foo")/foo/bar/baz?qux=123&quux=456