【发布时间】:2010-10-24 21:05:29
【问题描述】:
有什么方法可以让我使用 C# 加载然后“渲染”一个 ascx 控件?
本质上,我正在尝试用 C# 函数替换内联 ASP,该函数将返回相同的 HTML。然后,这将让我将其设置为 webmethod,以便我可以使用生成原始 html 的相同代码使用 jQuery 更新页面的该部分。
我真的需要一些方法来做到这一点,这似乎是一条合乎逻辑的路线。
【问题讨论】:
有什么方法可以让我使用 C# 加载然后“渲染”一个 ascx 控件?
本质上,我正在尝试用 C# 函数替换内联 ASP,该函数将返回相同的 HTML。然后,这将让我将其设置为 webmethod,以便我可以使用生成原始 html 的相同代码使用 jQuery 更新页面的该部分。
我真的需要一些方法来做到这一点,这似乎是一条合乎逻辑的路线。
【问题讨论】:
您需要创建一个在其中呈现控件的页面:
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 有一些相关信息,我借用了一些代码)。
【讨论】:
Keltex 的答案是唯一对我有用的,因为我正在使用嵌套的用户控件。此外,如果您想将参数传递给您的用户控件,您可以这样做:
_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path);
viewcontrol.MyParam = "My value";
【讨论】:
这个Explanation 应该有您正在寻找的答案。基本上你必须在页面中声明控件,然后在代码隐藏中声明 LoadControl。
【讨论】:
我没有尝试过,但是你可以使用 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 对象...这意味着不会动态加载用户控件。
【讨论】:
使用起来非常简单:
yourItem.Controls.Add(LoadControl("~/user control File path"));
【讨论】: