加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于AJAX调用的Asp.Net单一控件呈现

发布时间:2020-12-16 03:08:38 所属栏目:百科 来源:网络整理
导读:我正在尝试实现类似于 this或 this的东西. 我创建了一个用户控件,一个Web服务和一个Web方法来返回控件的渲染html,通过jQuery执行ajax调用. 一切正常,但如果我在使用相对路径的用户控件中放置一些东西(在我的情况下是一个带有NavigateUrl =“?/ mypage.aspx”
我正在尝试实现类似于 this或 this的东西.

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

一切正常,但如果我在使用相对路径的用户控件中放置一些东西(在我的情况下是一个带有NavigateUrl =“?/ mypage.aspx”的HyperLink),相对路径的分辨率在我的开发服务器中失败.

我期待着:
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”确实存在于根目录中.

然后我编写了一个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-class并不打算像那样实例化.如果我们启动Reflector,我们很快就会发现Asp.Net内部在实例化一个Page类并将其作为IHttpHandler返回后设置了一个重要的属性.您必须设置AppRelativeTemplateSourceDirectory.这是一个存在于Control类上的属性,并在内部设置TemplateControlVirtualDirectory属性,例如HyperLink用于解析链接中“?”的正确URL.

在调用LoadControl方法之前设置此值非常重要,因为AppRelativeTemplateSourceDirectory的值会传递给“master”控件创建的控件.

如何获得在您的财产上设置的正确值?在HttpRuntime类上使用静态AppDomainAppVirtualPath.嘿,总结一下……这应该有用;

[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,false);

    return output.ToString();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读