使用C#代码加载ascx组件

时间:2009-05-08 18:25:41

标签: c# asp.net ascx

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

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

我真的需要一些方法来做这件事,这似乎是一条合乎逻辑的路线。

5 个答案:

答案 0 :(得分:17)

您需要创建一个用于呈现控件的页面:

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();
    }
}

用户控件本身不会呈现。 (This article有一些相关的信息,我借用了一些代码)。

答案 1 :(得分: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对象......这意味着没有动态加载用户控件。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

viewcontrol.MyParam = "My value";

答案 4 :(得分:0)

使用起来非常简单:

yourItem.Controls.Add(LoadControl("~/user control File path"));