неправильные относительные пути гиперссылок с вызовами ajax

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

Для воспроизведения этой проблемы я создал веб-сайт с надписью «TestWebsite» в разделе «Веб-сайт по умолчанию» в IIS. У меня в корневой папке есть страница "Test.aspx". Также у меня есть папка UserControls, в которой находится мой пользовательский элемент управления «TestUserControl.ascx». Теперь я просто вызываю свой веб-метод на странице, который загружает элемент управления и возвращает html. Проблема, с которой я столкнулся, заключается в том, что относительный путь 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]
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

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

После некоторого поиска в Интернете я обнаружил аналогичную проблему на

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

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

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

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

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

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


person Prashant    schedule 10.04.2011    source источник


Ответы (2)


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

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

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

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

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

person Marty Spallone    schedule 05.01.2012

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