Я пытаюсь реализовать что-то похожее на это или это .
Я создал пользовательский элемент управления, веб-службу и веб-метод для возврата обработанного html-элемента управления, выполняя вызовы ajax через jQuery.
Все работает нормально, но если я помещаю что-то в пользовательский элемент управления, который использует относительный путь (в моем случае HyperLink с NavigateUrl = "~ / mypage.aspx"), разрешение относительного пути не выполняется на моем сервере разработки.
Я ожидаю:
http://localhost:999/MyApp/mypage.aspx
Но я получаю:
http://localhost:999/mypage.aspx
Отсутствует «MyApp» ...
Я думаю, что проблема заключается в создании страницы, используемой для загрузки элемента управления:
Page page = new Page();
Control control = page.LoadControl(userControlVirtualPath);
page.Controls.Add(control);
...
Но я не могу понять, почему ....
EDIT
Просто для наглядности
Мой пользовательский элемент управления находится на ~/ascx/mycontrol.ascx
и содержит действительно простую структуру: теперь просто гиперссылка с NavigateUrl, например "~/mypage.aspx"
.
И "mypage.aspx" действительно находится в корне.
Затем я создал веб-сервис, чтобы вернуть ajax частично визуализированный элемент управления:
[ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class wsAsynch : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public string GetControl(int parma1, int param2)
{
/* ...do some stuff with params... */
Page pageHolder = new Page();
UserControl viewControl = (UserControl)pageHolder.LoadControl("~/ascx/mycontrol.ascx");
Type viewControlType = viewControl.GetType();
/* ...set control properties with reflection... */
pageHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
}
HTML-код корректно отображается, но относительный путь в NavigateUrl гиперссылки неверно разрешен, потому что, когда я выполняю проект с развивающегося сервера VS2008, корнем моего приложения является
http://localhost:999/MyApp/
и это нормально, но NavigateUrl разрешается как
http://localhost:999/mypage.aspx
проигрыш / MyApp /.
Конечно, если я помещу свой ascx в реальную страницу вместо экземпляра pageHolder, используемого в ws, все будет работать нормально.
Другая странная вещь заключается в том, что если я установлю hl.NavigateUrl = Page.ResolveUrl("~/mypage.aspx")
, я получу правильный URL-адрес страницы:
http://localhost:999/MyApp/mypage.aspx
И сейчас я сделаю это, но я бы понял, ПОЧЕМУ это не работает нормальным образом.
Есть идеи?