10

有什么方法可以使用 C# 加载然后“渲染”一个 ascx 控件?

本质上,我试图用 C# 函数替换内联 ASP,该函数将返回相同的 HTML。然后,这将让我将其设置为 webmethod,以便我可以使用生成原始 html 的相同代码使用 jQuery 更新页面的该部分。

我真的需要某种方式来做到这一点,这似乎是一条合乎逻辑的路线。

4

5 回答 5

18

You need to create a page in which you render the control:

public static string RenderUserControl(string path)
{
    Page pageHolder = new Page();
    Control viewControl = pageHolder.LoadControl(path);

    pageHolder.Controls.Add(viewControl);
    using(StringWriter output = new StringWriter())
    {
        HttpContext.Current.Server.Execute(pageHolder, output, false);
        return output.ToString();
    }
}

A user control on its own will not render. (This article has some related information from which I borrowed some code).

于 2009-05-08T19:33:45.137 回答
2

Keltex 的答案是唯一对我有用的,因为我正在使用嵌套的用户控件。此外,如果您想将参数传递给您的用户控件,您可以通过以下方式进行:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path);

viewcontrol.MyParam = "My value";
于 2010-04-20T14:08:50.507 回答
1

这个解释应该有你正在寻找的答案。基本上,您必须在页面中声明控件,然后在代码隐藏中声明 LoadControl。

于 2009-05-08T18:50:15.787 回答
1

我没有尝试过,但是您可以使用 LoadControl 函数加载控件:

Control Example = LoadControl("~\\Controls\\MyControl.ascx");

然后你可以尝试渲染控件:

StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Example.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

但请确保在页面上覆盖 VerifyRenderingInServerForm 并将 EnableEventValidation 切换为 false。

忘记我上面写的。我回去测试了,你不能调用 LoadControl,因为 webmethod 是静态的。由于它是静态的,因此您没有要调用的 Page 对象...这意味着无需动态加载用户控件。

于 2009-05-08T18:41:06.137 回答
0

its very simple to use:

yourItem.Controls.Add(LoadControl("~/user control File path"));
于 2013-04-14T20:25:50.833 回答