0

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

1 に答える 1

0

わかりましたので、回避策を見つけました。UserControlオブジェクトを使用する代わりにPage、サーバー コントロールを適切にレンダリングするオブジェクトを使用してコントロールをレンダリングします。この後、html コードをformオブジェクトでラップする必要がありましたrunat="server"。今、私はそれを得るのに問題はありません。

Load欠点は、イベントが発生しないため、リピーターをデータバインドする呼び出しを行う必要があることです。

コントロール:

<form runat="server">
<table id="user-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>
</form>

コードビハインド:

    public partial class UserComments : System.Web.UI.UserControl
    {
        public List<CallReview> Comments;

        public void BindComments()
        {
            commentsRepeater.DataSource = Comments;
            commentsRepeater.DataBind();
        }
    }

コントロールをレンダリングして生の HTML を取得するコード:

//Will be used to load the control
var loader = new Page();
var ctl = (UserComments)loader.LoadControl("~/Controls/UserComments.ascx");

//Set the comments property of the control
ctl.Comments = _callAdapter.GetCallComments(callId);
ctl.BindComments();

//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();
于 2013-10-04T23:02:38.613 に答える