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

前端之家收集整理的这篇文章主要介绍了用于AJAX调用的Asp.Net单一控件呈现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现类似于 thisthis的东西.

我创建了一个用户控件,一个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();
}

猜你在找的Ajax相关文章