【问题标题】:How does Response.Redirect calculate the URL for "~/folder1/folder2/some.aspx"Response.Redirect 如何计算“~/folder1/folder2/some.aspx”的 URL
【发布时间】:2011-06-06 18:54:06
【问题描述】:

这可能听起来是一个微不足道的问题,但由于某种原因它不是。

不需要重定向

Response.Redirect("~/folder1/folder2/some.aspx")

我需要这个位置,就好像它的行为一样

string navigatingUrl = Response.Redirect("~/folder1/folder2/some.aspx")

我开始尝试复制这个

string navigatingUrl = new Uri(HttpContext.Current.Request.Url,
                     new Uri("~/folder1/folder2/some.aspx", UriKind.Relative));

这会生成"http://www.fullRequestUrl/~/folder1/folder2/some.aspx"

编辑: 好吧,我知道为什么我绝对讨厌微软的 URL API。祝写这行代码的人见鬼去吧

else if (uriKind == UriKind.Relative) 
{
// Here we know that we can create an absolute Uri, but the user has requested 
    only a relative one
e = GetException(ParsingError.CannotCreateRelative);
} 

会有什么人会抛出这样的错误?这条 if 语句完全破坏了 API。

【问题讨论】:

    标签: c# .net asp.net api uri


    【解决方案1】:

    我认为您正在寻找Control.ResolveUrl()。通常,您可能会使用在 Page 对象上找到的方法(如果您使用的是 WebForms)。

    【讨论】:

    • 在一个与任何类型的控件没有耦合的 API 中编写 using(var c = new Control()) url = c.ResolveUrl(input) 感觉很不对劲。
    • 您在使用 WebForms 吗?如果是这样,您始终可以为您的 Page 类创建一个 IUrlResolver 接口(这需要 ResolveUrl() 方法),然后将您的 Page 传递到您的 API(使用该接口来限制暴露并允许轻松替换)。不幸的是,我认为唯一的选择将同样丑陋。可能最好的替代方法是编写自己的替换代码(检查反射器以实现 ResolveUrl())方法。
    • 为什么 .NET 的 url API 如此完全保密,这实在说不通。
    【解决方案2】:

    Get absolute url for a file in my asp.net project to include HTTP// etc for use externally? 窃取的唯一绝对方法是:

    string url = Request.Url.GetLeftPart(UriPartial.Authority) 
                        + VirtualPathUtility.ToAbsolute(relativePath)
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2018-10-03
      • 2018-12-20
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多