Я пытаюсь реализовать что-то подобное этому или этому.
Я создал пользовательский элемент управления, веб-сервис и веб-метод для возврата представленного 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);
...
Но я не могу выяснить почему....
ОТРЕДАКТИРУЙТЕ Только для ясности
Мой пользовательский элемент управления расположен в ~/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, корень моего приложения
и это прекрасно, но NavigateUrl разрешен как
http://localhost:999/mypage.aspx
потеря/MyApp/. Конечно, если я поместил свой ascx в реальную страницу вместо pageHolder экземпляра, используемого в ws, все хорошо работает.
Другая странная вещь - это, если я установил hl.NavigateUrl = Page.ResolveUrl("~/mypage.aspx")
Я получаю корректный URL страницы: http://localhost:999/MyApp/mypage.aspx
И к настоящему времени я сделаю это, но я понял бы, ПОЧЕМУ это не работает нормальным способом. Какая-либо идея?
Tildy протолкнула путь в корень приложения, чтобы получить те результаты, которые вы видите. Вы захотите использовать:
NavigateUrl="./whatever.aspx"
РЕДАКТИРОВАТЬ:
Вот ссылка, которая также может оказаться полезной ... http://msdn.microsoft.com/en-us/library/ms178116.aspx
Я нахожу, что корень /MyApp/ вызывает всевозможные проблемы. Это не совсем отвечает на ваш вопрос "почему не работает обычный способ", но вы понимаете, что можете избавиться от /MyApp/ и разместить свой сайт на http:/localhost/...?
Просто установите Virtual Path в свойствах сайта на '/'.
Это все прояснит, если, конечно, вы не пытаетесь одновременно разместить несколько приложений на компьютере разработчика.