带有ajax调用的不正确的超链接相对路径

时间:2011-04-10 20:19:21

标签: .net ajax user-controls render relative-path

我最近将我的应用程序升级到.net 4.0。我有一个问题,正确呈现超链接navigateurl相对路径。我通过jquery调用webmethod,它加载一个usercontrol并获取我在页面上显示它的html。 usercontrol具有带有超链接字段的网格视图,该超链接字段使用波浪号(〜)绑定到某些应用程序相对路径。

为了复制这个问题,我创建了一个网站说" TestWebsite"在"默认网站"在IIS中。我有一个页面" Test.aspx"在根文件夹下。我还有UserControls文件夹,它有我的usercontrol" TestUserControl.ascx"。现在我只需在页面中调用我的webmethod,它将加载控件并返回html。我遇到的问题是Hyperlink url相对路径被错误地呈现。它显示

http://localhost/SubFolder/Sample1.aspx而不是从我的根文件夹(TestWebsite)开始

http://localhost/TestWebsite/SubFolder/Sample1.aspx

以下是示例代码

Test.aspx文件

<div>
     <script type="text/javascript">

         $(document).ready(function () {
             $.ajax({
                 type: "POST",
                 url: "Test.aspx/TestMethod",
                 data: "{}",
                 contentType: "application/json; charset=utf-8",
                 dataType: "json",
                 success: function (msg) {
                     $("#result").html(msg.d);
                 }
             });
         });        
</script>

</div>

<div id="result"></div>

Test.aspx.cs - webmethod

 [WebMethod]
public static string TestMethod()
{
    StringWriter tw = new StringWriter();
    Control control = null;

    Page page = new Page();
    try
    {
        control = page.LoadControl("~/UserControls/TestUserControl.ascx");
    }
    catch (Exception ex)
    {
        string name = ex.Message;
    }

    HtmlForm form = new HtmlForm();
    form.ID = "_form";
    page.Controls.Add(form);

    form.Controls.Add(control);

    page.Controls.Add(form);

    HttpContext.Current.Server.Execute(page, tw, true);

    string html = tw.ToString();
    return html;
}

用户控件

 protected void Page_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("TestLink");
    DataRow dr = dt.NewRow();
    dr["TestLink"] = "~/SubFolder/Sample1.aspx";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["TestLink"] = "~/SubFolder/Sample2.aspx";
    dt.Rows.Add(dr);

    GVTest.DataSource = dt;
    GVTest.DataBind();            
}

TestUserControl.ascx

由于格式问题,我无法在此处复制我的代码,但我在这里有一个简单的gridview,其中包含一个超链接服务器控件,我绑定了导航器。

在网上进行一些搜索后,我在

发现了类似的问题

Asp.Net single control render for AJAX calls

提到设置AppRelativeTemplateSourceDirectory的地方。但即使将其设置为AppDomainAppVirtualPath,它也不适用于我。

在Server.Execute之后,将相对url(〜/ SubFolder /)更改为一级(〜/ SubFolder /)

我不确定我是否遗漏了什么?如果有人能帮助我解决这个问题,我将不胜感激。

仅供参考:我使用的是IIS 7.5和Windows 7。

谢谢, PRASHANT

2 个答案:

答案 0 :(得分:1)

我在渲染控件中的相对URL问题与我认为您遇到的相同。

我的问题是我注意到request.path是相对于服务调用的,显然AJAX或IIS在你当前页面下创建了一个子目录,这就是为什么ResolveClientUrl或“tilde”解析为额外的父目录...

因此,在您的情况下,我的猜测是您的控件实际上是在

中创建的

http://Test.aspx/TestMethod(WebMethod的名称)

这实际上是发生在我身上的事情,我的所有网址都有额外的.. \前置。 玛蒂

答案 1 :(得分:0)

Marty所描述的一切都是正确的,我也不确定如何解决这个问题,但这是我使用的一种解决方法,它会检测何时添加额外的“../”并通过读取来纠正这种情况子目录到URL:

        // this is the link that will be appended to the fullpath+subdirectory of the app
        var resolvedLinkInBrowser = this.ResolveClientUrl(builtUrl);

        if (resolvedLinkInBrowser.Contains("../"))
        {
            // when an ajax call is made, it is made using a service call. This service call for some
            // reason does not think that it should serve links relative to the subdirectory, but thinks
            // that it should serve links relative to the root of the domain. That is why when the link is resolved,
            // WebForms adds a '../' to the link, to get it back to the root domain. Since we've detected this case,
            // we can insert the subdirectory in to our not-yet-resolved url, to force the resulting url to be correct.
            // this is a workaround. If this issue can be fixed any other way, please do that.
            builtUrl = builtUrl.Replace("~/", "~" + HttpRuntime.AppDomainAppVirtualPath + "/");
        }