неверные гиперссылки относительных путей с вызовами ajax - PullRequest
2 голосов
/ 11 апреля 2011

Я недавно обновил свое приложение до .net 4.0.У меня проблема с относительными путями гиперссылки navigateurl, которые отображаются правильно.Я вызываю веб-метод через jquery, который загружает usercontrol и получает HTML, который я отображаю на странице.Пользовательский контроль имеет сетку с полем гиперссылки, который привязан к относительным путям некоторых приложений с помощью тильды (~).

Для воспроизведения этой проблемы я создал веб-сайт с именем «TestWebsite» в разделе «Default Website» в IIS.У меня есть страница «Test.aspx» в корневой папке.Также у меня есть папка UserControls, в которой есть мой пользовательский контроль "TestUserControl.ascx".Теперь я просто вызываю свой веб-метод на странице, который загружает элемент управления и возвращает HTML.Проблема, с которой я столкнулся, заключается в том, что относительный путь к гиперссылке отображается неправильно.Он отображает

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;
}

UserControl

 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

Я не могу скопировать свой код здесь из-за проблем с форматированием, но у меня есть простое представление сетки с серверным элементом управления гиперссылкой, где я привязываю navigateurl.После некоторого поиска в Интернете я обнаружил эту похожую проблему в

Рендеринг одного элемента управления Asp.Net для вызовов AJAX

, где упоминалось, что он устанавливает AppRelativeTemplateSourceDirectory.но даже после установки этого значения в AppDomainAppVirtualPath это не работает для меня.

После Server.Execute относительный URL (~ / SubFolder /) изменяется на один уровень выше, давая (../SubFolder/)

Я не уверен, что что-то пропустил?Буду признателен, если кто-нибудь поможет мне решить эту проблему.

К вашему сведению: я использую IIS 7.5 и windows 7.

Спасибо, Прашант

Ответы [ 2 ]

1 голос
/ 05 января 2012

У меня та же проблема с относительными URL-адресами в отображаемом элементе управления, и я думаю, что вы столкнулись с этим.

Моя проблема в том, что я заметил, что request.path относится к служебному вызову, по-видимому, AJAX или IIS создают подкаталог под вашей текущей страницей, и поэтому ResolveClientUrl или "tilde" преобразуется в дополнительный родительский каталог ...

Так что в вашем случае я предполагаю, что ваш элемент управления фактически создан в

http://Test.aspx/TestMethod (имя WebMethod)

Это на самом деле то, чтопроисходит со мной, все мои URL-адреса имеют дополнительный .. \ prepended.Marty

0 голосов
/ 07 декабря 2017

Все, что описал Марти, правильно, и я не уверен, как решить эту проблему, но вот обходной путь, который я использую, который определяет, когда добавляется дополнительный «../», и исправляет ситуацию, читая подкаталог в 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 + "/");
        }
...