我最近将我的应用程序升级到.net 4.0。我有一个问题,正确呈现超链接navigateurl相对路径。我通过jquery调用webmethod,它加载一个usercontrol并获取我在页面上显示它的html。 usercontrol具有带有超链接字段的网格视图,该超链接字段使用波浪号(〜)绑定到某些应用程序相对路径。
为了复制这个问题,我创建了一个网站说" TestWebsite"在"默认网站"在IIS中。我有一个页面" Test.aspx"在根文件夹下。我还有UserControls文件夹,它有我的usercontrol" TestUserControl.ascx"。现在我只需在页面中调用我的webmethod,它将加载控件并返回html。我遇到的问题是Hyperlink 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
[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;
}
用户控件
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
由于格式问题,我无法在此处复制我的代码,但我在这里有一个简单的gridview,其中包含一个超链接服务器控件,我绑定了导航器。
在网上进行一些搜索后,我在
发现了类似的问题Asp.Net single control render for AJAX calls
提到设置AppRelativeTemplateSourceDirectory的地方。但即使将其设置为AppDomainAppVirtualPath,它也不适用于我。
在Server.Execute之后,将相对url(〜/ SubFolder /)更改为一级(〜/ SubFolder /)
我不确定我是否遗漏了什么?如果有人能帮助我解决这个问题,我将不胜感激。
仅供参考:我使用的是IIS 7.5和Windows 7。
谢谢, PRASHANT
答案 0 :(得分:1)
我在渲染控件中的相对URL问题与我认为您遇到的相同。
我的问题是我注意到request.path是相对于服务调用的,显然AJAX或IIS在你当前页面下创建了一个子目录,这就是为什么ResolveClientUrl或“tilde”解析为额外的父目录...
因此,在您的情况下,我的猜测是您的控件实际上是在
中创建的http://Test.aspx/TestMethod(WebMethod的名称)
这实际上是发生在我身上的事情,我的所有网址都有额外的.. \前置。 玛蒂
答案 1 :(得分:0)
Marty所描述的一切都是正确的,我也不确定如何解决这个问题,但这是我使用的一种解决方法,它会检测何时添加额外的“../”并通过读取来纠正这种情况子目录到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 + "/");
}