gpt4 book ai didi

用于 AJAX 调用的 Asp.Net 单控件渲染

转载 作者:行者123 更新时间:2023-12-04 15:27:42 27 4
gpt4 key购买 nike

我正在尝试实现类似于 this 的东西或 this .

我创建了一个用户控件、一个 Web 服务和一个 Web 方法来返回控件的呈现 html,通过 jQuery 执行 ajax 调用。

一切正常,但是如果我在使用相对路径的用户控件中放置一些东西(在我的例子中是带有 NavigateUrl="~/mypage.aspx"的超链接),相对路径的解析在我的开发服务器中失败。

我期待着:
http://localhost:999/MyApp/mypage.aspx

但我得到:
http://localhost:999/mypage.aspx

缺少“我的应用程序”...

我认为问题在于用于加载控件的页面的创建:

Page page = new Page();
Control control = page.LoadControl(userControlVirtualPath);
page.Controls.Add(control);
...

但我不明白为什么......

编辑
只是为了清楚

我的用户控件位于 ~/ascx/mycontrol.ascx并且包含一个非常简单的结构:现在只是一个带有 NavigateUrl 的超链接,如 "~/mypage.aspx" .
而“mypage.aspx”确实驻留在根上。

然后我编写了一个 web 服务来返回给 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 放在真实页面中,而不是 ws 中使用的 pageHolder 实例,则一切正常。

另一个奇怪的是,如果我设置了 hl.NavigateUrl = Page.ResolveUrl("~/mypage.aspx")我得到了正确的页面网址:
http://localhost:999/MyApp/mypage.aspx

现在我会这样做,但我会理解为什么它不能以正常方式工作。
任何的想法?

最佳答案

问题是 Page 类并不打算像那样实例化。如果我们启动 Reflector,我们将很快看到 Asp.Net 内部在实例化 Page 类并将其作为 IHttpHandler 返回后设置了一个重要的属性。您必须设置 AppRelativeTemplateSourceDirectory。这是一个存在于 Control 类中的属性,它在内部设置 TemplateControlVirtualDirectory 属性,例如 HyperLink 使用该属性来解析链接中“~”的正确 url。

在调用 LoadControl 方法之前设置此值很重要,因为 AppRelativeTemplateSourceDirectory 的值会传递给由“主”控件创建的控件。

如何获得正确的值(value)以设置在您的属性(property)上?在 HttpRuntime 类上使用静态 AppDomainAppVirtualPath。 Soo,总而言之......这应该有效;

[WebMethod(EnableSession = true)]
public string GetControl(int parma1, int param2)
{
/* ...do some stuff with params... */
var pageHolder = new Page() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath };

var viewControl = (UserControl)pageHolder.LoadControl("~/ascx/mycontrol.ascx");
var viewControlType = viewControl.GetType();

/* ...set control properties with reflection... */

pageHolder.Controls.Add(viewControl);
var output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);

return output.ToString();
}

关于用于 AJAX 调用的 Asp.Net 单控件渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com