当前位置: 首页 > 面试题库 >

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

漆雕亮
2023-03-14
问题内容

我正在尝试实现类似于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 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")我将获得页面的正确URL: http:// localhost:999 / MyApp
/ mypage.aspx

到现在为止,我会这样做,但是我会明白为什么它无法正常运行。任何想法?


问题答案:

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

请务必在调用LoadControl方法之前设置此值,因为AppRelativeTemplateSourceDirectory的值会传递到“主”控件创建的控件上。

如何获得正确的值来设置您的财产?在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, output, false);

    return output.ToString();
}


 类似资料:
  • 问题内容: 我有一个ASP.NET网站和一个自定义控件(我们称之为myControl)。我需要使用AJAX在此控件上调用方法。我将JavaScript(jQuery)的Ajax调用发布到C#WebMethod。这可以正常工作,但是我无法在静态WebMethod中进入myControl。任何想法如何解决这个问题? 简短版:从JS到C#WebMethod的AJAX调用有效-> 此处(在此方法中)我需要

  • 问题内容: 这可能是一个简单的问题,但对我来说目前还不清楚,我必须把事情整理好……也许有人可以帮我解决这个问题)。 我知道AVC附带了MVC。我知道有Microsoft库,还有jquery。我知道,在MVC 3中,他们引入了不引人注目的javascript,它为html添加了一些特殊标签以进行清理… 但是ist如何一起玩? 示例:我想为每个ajax发布一个远程表单(局部视图)以向博客文章添加评论。

  • 希望你能帮我解决这个问题,因为它已经困扰我几天了。 我对页面的标记:[表] 我的自定义DataTable扩展Java代码(扩展以确保添加了所有outputMarkUp):@override protected void onInitialize(){super.onInitialize();this.addtopToolbar(新的NavigationToolbar(this));this.add

  • 问题内容: 如何在ASP.net应用程序的服务器端检测请求是否为AJAX请求(来自jQuery)。我不想这样做:mypage.aspx?this_is_ajax = true … 例如 在服务器端,当请求是ajax请求时,我想做某些事情… 谢谢! 问题答案: ASP.NET MVC对此做了很大的扩展,可以与JQuery一起使用。它以这种方式检查它: 检查核心集合: 检查标头集合(确保其不为null

  • 问题内容: 在我的React应用程序中,我有一个网格。用户可以一次选择许多网格行,然后单击按钮以对选定的网格行执行批量操作。 在服务器端,单击批量操作后,我有一个脚本要针对每个选定的行执行(为了简化问题,我在下面的示例中为每个选定的行调用“ jsonplaceholder.typicode.com”)按钮。单击批量操作按钮时,将在操作创建器中获得selectedRows,在该操作器上遍历selec

  • 问题内容: 我在aspx上有一个asp按钮: 如您所见,我正在调用一个使用AJAX调用C#方法的javascript函数。我这样做: 问题是,单击按钮时,我总是收到错误消息。我做错什么了吗? 编辑:C#方法。我已经设置了一个断点,以查看是否调用了该方法,但显然没有。 问题答案: 您的方法必须声明为,并用修饰。因此,您的方法应为: 编辑!!! 我看你用一些控制在你的代码(如,)。完成方法后,您将无法