有什么方法可以使用C#加载然后“渲染”ascx控件?
基本上我试图用C#函数替换内联ASP,它将返回相同的HTML。然后,我可以将其设置为webmethod,以便我可以使用生成原始html的相同代码使用jQuery更新页面的该部分。
我真的需要一些方法来做这件事,这似乎是一条合乎逻辑的路线。
答案 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"));