ASP.NET: Controls.Count всегда ноль - PullRequest
       3

ASP.NET: Controls.Count всегда ноль

0 голосов
/ 06 августа 2010

Я пытаюсь запустить «Controls.Clear», но он никогда не работает, потому что Controls.Count всегда равен нулю.Это не должно быть так.Я вставил логику программы ниже.

Комментарии создаются элементом управления - Comments.ascx, который запускает нижеуказанное событие OnInit:

protected override void OnInit(EventArgs e)
{
            _presenter = new CommentsPresenter();
            _presenter.Init(this, IsPostBack);
}

И метод Init класса CommentsPresenter заполняет представление следующим образом:

public void Init(IComments view, bool isPostBack)
        {
            _view = view;

            _view.ShowCommentBox(_webContext.CurrentUser != null);
        }

Как только представление уровня представления заполнено, следующие два метода в CommentsPresenter.cs используются для разработки пользовательского интерфейса.Вы увидите, что «AddComment» вызывает метод «ClearComment», о котором идет речь:

public void LoadComments()
        {
            _view.LoadComments(_commentRepository.GetCommentsBySystemObject(_view.SystemObjectId,
                                                                             _view.SystemObjectRecordId));    
        }

        public void AddComment(string comment)
        {
            var c = new Comment
                        {
                            Body = comment,
                            CommentByAccountId = _webContext.CurrentUser.AccountId,
                            CommentByUserName = _webContext.CurrentUser.UserName,
                            CreateDate = DateTime.Now,
                            SystemObjectId = _view.SystemObjectId,
                            SystemObjectRecordId = _view.SystemObjectRecordId
                        };
            _commentRepository.SaveComment(c);
            _view.ClearComments();
            LoadComments();
        }

Теперь, возвращаясь к серверному элементу управления Comments.ascx, мы видим, как запускается «AddComment» (и, следовательно, ClearComments):

protected void Page_Load(object sender, EventArgs e)
{
    _presenter.LoadComments();
}

protected void BtnAddCommentClick(object sender, EventArgs e)
{
    _presenter.AddComment(commentMark.Text);
    commentMark.Text = "";
}

public void ClearComments()
{
    if (commentPosted.Controls.Count > 0)
    {
        //var ctls = commentPosted.Controls[0];
        //    ctls.Controls.Clear();
        commentPosted.Controls.Clear();
    }
}

public void LoadComments(List<Comment> comments)
{
    var sb = new StringBuilder();

    if(comments.Count > 0)
    {
        commentPosted.Controls.Add(new LiteralControl("<div id=\"CommentPosted\">"));

        foreach (Comment comment in comments)
        {
            sb.Append("<div class=\"commentPanel\" id=\"record-" + comment.CommentId + "\" align=\"left\">");
            sb.Append("<a href=\"" + WebContext.RootUrl + comment.CommentByUserName + "\tabindex=\"-1\">");
            sb.Append(GetProfileImage(comment.CommentByAccountId) + "</a>");
            sb.Append("<label class=\"postedComments\">" + comment.Body + "</label>");
            sb.Append("<br clear=\"all\">"); 
                sb.Append("<span style=\"margin-left: 43px; color: rgb(102, 102, 102); font-size: 11px;\">few seconds ago");
            sb.Append("</span>&nbsp;&nbsp;<a href=\"#\" id=\"CID-" + comment.CommentId + "\" class=\"c_delete\">Delete</a></div>");

            commentPosted.Controls.Add(new LiteralControl(sb.ToString()));
        }

        commentPosted.Controls.Add(new LiteralControl("</div>"));

    }
}

И вот как выглядит HTML для моего пользовательского элемента управления Comments.ascx:

<asp:UpdatePanel runat="server">
    <ContentTemplate>
        <asp:Panel runat="server" ID="pnlComment">
            <asp:PlaceHolder ID="commentPosted" runat="server"></asp:PlaceHolder>
            <div class="commentBox" id="commentBox" style="" align="right">
                <a href="<%= WebContext.RootUrl %><%= WebContext.CurrentUser.UserName %> " tabindex="-1">
                <%= GetProfileImage(WebContext.CurrentUser.AccountId) %></a>
                <label id="record-128">
                    <asp:TextBox ID="commentMark" Width="300" CssClass="commentMark" TextMode="MultiLine" Columns="60" runat="server"></asp:TextBox>
                </label>
                <br clear="all">
                <br />
                <asp:Button Text="Comment" ID="btnAddComment" style="display:inline-block;" CssClass="small button comment" runat="server" OnClick="BtnAddCommentClick" />
            </div>
        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>

Наконец, ниже приведен сгенерированный HTML:

        <div id="ctl00_ContentCenter_repFilter_ctl08_Comments1_pnlComment">


            <div class="commentBox" id="commentBox" style="" align="right">
                <a href="http://localhost:1663/GrumpyCat%20" tabindex="-1">

                <img alt="" src="http://localhost:1663/images/ProfileAvatar/ProfileImage.aspx?AccountId=53&amp;w=30&amp;h=30" style="float: left;" width="30" height="30"></a>
                <label id="record-128">
                    <textarea name="ctl00$ContentCenter$repFilter$ctl08$Comments1$commentMark" rows="2" cols="60" id="ctl00_ContentCenter_repFilter_ctl08_Comments1_commentMark" class="commentMark" style="width: 300px; color: rgb(51, 51, 51);"></textarea>
                </label>
                <br clear="all">
                <br>
                <input name="ctl00$ContentCenter$repFilter$ctl08$Comments1$btnAddComment" value="Comment" id="ctl00_ContentCenter_repFilter_ctl08_Comments1_btnAddComment" class="small button comment" style="display: inline-block;" type="submit">
            </div>


        </div>

Спасибо!

1 Ответ

2 голосов
/ 06 августа 2010

В зависимости от того, когда вы звоните Controls.Clear, элементы управления могут быть еще не созданы. Проверьте жизненный цикл страницы ASP.NET: http://msdn.microsoft.com/en-us/library/ms178472.aspx.

Похоже, что вы также публикуете исходный код HTML из браузера - если вышеприведенное не решит его за вас, пожалуйста, опубликуйте исходный код .aspx и сообщите нам, где вы получаете доступ к коллекции Controls.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...