gpt4 book ai didi

asp.net - ResolveClientUrl 在 ASP.Net 4 和 3.5 中的工作方式不同

转载 作者:行者123 更新时间:2023-12-05 00:04:01 25 4
gpt4 key购买 nike

[如果我的问题标题没有准确描述我的问题,我深表歉意——如果你能想到一个更好的标题并有权更改它,那么请随时更改它!]。

我想我偶然发现了 ASP.Net 3.5 和 4.0 之间的一个小的突破性变化。

[编辑:我已经确认 twix 3.5 和 4.0 的行为发生了变化 - 请参阅我的答案]

这是场景: -

我有一个 ASP.Net 3.5 Web 应用程序。
我有一个简单的用户控件 {appRoot}/Controls/Widgets/MyPictureAndTextWidget.ascx,它本质上包含一些文本和另一个用户控件 ({appRoot}/Controls/Widgets/MyPicture.ascx)。

在大多数情况下,此控件以正常方式使用——即将它包含在其他页面的标记中,但我有一个实例,我需要获取 HTML 以使用 Ajax 在客户端上呈现。

我实现这一目标的方法是编写一个 asmx Web 服务,该服务以编程方式创建一个新页面并动态“加载控制”用户控件,然后在字符串生成器中捕获页面渲染的输出 - 特别不优雅,但它有效!来源见底部。

但是,将项目升级到Asp.Net 4.0后,上面的代码就不再像以前那样工作了;图像,渲染时有 src="../images/xxx.png (注意不需要的“../”)。

我创建了一个小演示应用程序 http://cid-916198839f3e806c.office.live.com/self.aspx/Public/TestingImageWTF.zip如果你想自己运行它。当您使用 3.5 编译应用程序时,它可以工作(即您在测试页面上看到 2 张蜘蛛图片)但在 4.0 下编译并运行时,您只能看到 1 张蜘蛛(另一张图片的 URL 错误)。

我能想出的唯一解释是 ResolveClientUrl方法(Image 控件将使用它来计算当前执行页面的图像的相对路径)的行为不同。图像 url 显示为“../images/xxx.png”这一事实意味着图像控件“认为”它在运行时在具有类似“{appRoot}/folder/handler”路径的页面中执行在 4.0 下,但它认为它在 3.5 下的上下文“{appRoot}/handler”中运行。

我希望这对您有意义 - 抱歉,如果我没有非常清楚或简洁地描述问题。

任何人都可以告诉我们如何: -

  • 恢复 3.5 行为(显然没有恢复到 3.5 框架!)
  • 还是首先在 Web 服务中生成 HTML 的更好方法?

  • 来源

    完整的测试应用程序可以从这里下载 http://cid-916198839f3e806c.office.live.com/self.aspx/Public/TestingImageWTF.zip

    网络服务
        [WebMethod]
    [ScriptMethod]
    public string GetWidgetHtml(int number)
    {
    var pageHolder = new Page
    {
    //AppRelativeVirtualPath = "~/" // I tried playing with this but it made no difference!
    };
    for (int i = 0; i < number; i++)
    {
    var viewControl = (MyPictureAndTextWidget) pageHolder.LoadControl(@"~/Controls/Widgets/MyPictureAndTextWidget.ascx");
    pageHolder.Controls.Add(viewControl);
    }

    var output = new StringWriter();

    HttpContext.Current.Server.Execute(pageHolder, output, false);

    StringBuilder sb = output.GetStringBuilder();
    string fulloutput = sb.ToString();
    return fulloutput;
    }

    这是我的用户控件的内容

    控件/小部件/MyPictureAndTextWidget.ascx
        <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyPictureAndTextWidget.ascx.cs" Inherits="TestingImageWTF.Controls.Widgets.MyPictureAndTextWidget" %>
    <%@ Register TagName="Picture" TagPrefix="widget" Src="~/Controls/Widgets/MyPictureWidget.ascx" %>

    <div style="background:#EEEEEE; border:1px dashed;">
    <h4>My control</h4>
    Some text from the widget ....:
    <br /><widget:Picture runat="server" />
    </div>

    控件/小部件/MyPictureWidget.ascx
        <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyPictureWidget.ascx.cs" Inherits="TestingImageWTF.Controls.Widgets.MyWidget" %>

    <script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
    image.ImageUrl = "~/images/spider.png";
    }
    </script>
    <asp:Image ID="image" runat="server" />

    最佳答案

    o所以这里至少是答案的一部分。

    问题:ResolveClientUrl 在 ASP.Net 4 和 3.5 中的工作方式是否不同?

    答案: .

    行为的变化(我知道)是它以不同的方式对待 PathInfo。

    为了演示,请制作以下页面。

    <%@ Page Language="C#" AutoEventWireup="true"  %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
    <form id="form1" runat="server">
    DateTime.Now.Ticks: <%= DateTime.Now.Ticks %>
    <br />
    <asp:HyperLink runat="server" NavigateUrl="~/PathInfoLinkTest.aspx">This links to ~/PathInfoLinkTest.aspx</asp:HyperLink>
    <br />
    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/PathInfoLinkTest.aspx/foo/bar">This links to ~/PathInfoLinkTest.aspx/foo/bar</asp:HyperLink>
    <br />
    ResolveClientUrl("~/PathInfoLinkTest.aspx/foo/bar") = <%= ResolveClientUrl("~/PathInfoLinkTest.aspx/foo/bar") %>
    </form>
    </body>
    </html>

    并在 .Net4 和 .Net 3.5 下运行。

    您将在 3.5 下看到:
    ResolveClientUrl("~/PathInfoLinkTest.aspx/foo/bar") = ' PathInfoLinkTest.aspx/foo/bar '

    而在 4.0 下你会得到
    ResolveClientUrl("~/PathInfoLinkTest.aspx/foo/bar") = ' 酒吧 '

    该更改似乎是针对这些人遇到的问题的错误修复。
  • http://channel9.msdn.com/Forums/TechOff/256519-Am-I-crazy-here-but-there-appears-to-be-an-oversight-in-ASPNET
  • http://forums.asp.net/t/1138135.aspx/1

  • 本质上,3.5 中的 bug 是,如果您当前正在浏览 url http://host/app/page.aspx/foo/bar并且您想链接到 http://host/app/page2.aspx ,那么在客户端呈现的 URL 应该是 ../../page2.aspx .

    Asp.Net 4 是正确的!Asp.Net 3.5 没有 - 它将链接的 url 输出为“ page2.aspx” '(所以当点击时,浏览器会请求页面 ' http://host/app/page.aspx/foo/bar/page2.aspx'。如果你在 .Net 3.5 中运行上面的页面并点击第二个超链接几次,你可以看到这个错误的表现 - 然后看看您浏览器的地址栏!

    不幸的是,错误修复破坏了我的代码 - 因为我的代码依赖于 .Net 3.5 的(不正确的)行为:Web 服务请求始终具有 Pathinfo(Web 服务方法名称),因此当控件呈现自身时,调用 ResolveClientUrl( "~/xxx") (正确地) put 返回 "../xxx"。

    关于asp.net - ResolveClientUrl 在 ASP.Net 4 和 3.5 中的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6099336/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com