我目前正在尝试从 Web 窗体用户控件中获得一些功能。这个想法是以类似于 MVC 的 PartialView 的方式使用它。我想要做的是从代码创建控件,与服务器控件发生数据绑定,ASP Repeater
然后从该方法返回呈现的 HTML。
目前,我正在使用以下代码来定义用户控件:
<table id="comments">
<thead>
<tr>
<th>Created On</th>
<th>By</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<asp:Repeater ID="commentsRepeater" runat="server">
<ItemTemplate>
<tr class="user-comment">
<td><%#Eval("ReviewedOn")%></td>
<td><%#Eval("Reviewer")%></td>
<td><%#Eval("Comment")%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</tbody>
</table>
如果我将数据绑定代码放在 Load 事件中,则不会发生任何事情。如果我将它放入一个方法并调用它,我会收到以下异常:
Databinding methods such as Eval(), XPath(), and Bind() can only be used in controls contained in a page.
那么如何使用用户控件来获得我想要的结果呢?
更新:
这就是我目前尝试数据绑定的方式(这种方式不会绑定任何东西,但会返回周围的 html 字符串)
public partial class UserComments : System.Web.UI.UserControl
{
public List<CallReview> Comments;
protected void Page_Load(object sender, EventArgs e)
{
commentsRepeater.DataSource = Comments;
commentsRepeater.DataBind();
}
}
更新 2
添加有关我如何尝试加载控件以获取 HTML 表示的代码。
//Will be used to load the control
var loader = new UserControl();
var ctl = (UserComments)loader.LoadControl("~/Controls/UserComments.ascx");
//Set the comments property of the control
ctl.Comments = _callAdapter.GetCallComments(callId);
//Create streams the control will be rendered to
TextWriter txtWriter = new StringWriter();
HtmlTextWriter writer = new HtmlTextWriter(txtWriter);
//Render the control and write it to the stream
ctl.RenderControl(writer);
//Return the HTML
return txtWriter.ToString();