Недавно я обновил свое приложение до .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.
Спасибо, Прашант