現在、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();