【问题标题】:asp.net web page, getting jQuery Accordion plugin to work with asp:Repeater controlasp.net 网页,让 jQuery Accordion 插件与 asp:Repeater 控件一起使用
【发布时间】:2017-08-24 20:19:01
【问题描述】:

我正在做一个 asp.net 项目。我被要求创建一个页面,以便站点管理员可以添加文章,而其他所有人都可以在这些文章下添加 cmets。 我的数据库中有 2 个单独的表,文章/评论。在页面加载时,我将在面板中使用它们自己的相关 cmets 填充所有文章。 我还被要求使用 手风琴,以便所有 cmets 都以可折叠的方式显示! 我的问题是只有第一篇文章下面有可折叠的cmets,其余的都没有!

这是我的 aspx 页面:

    <%@ Page Title="Ref Notes" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="RefNotes.aspx.cs" Inherits="Root.RefNotes" %>    
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Panel ID="refNotes" CssClass="col-xs-12 data-container" runat="server">
    </asp:Panel>
</asp:Content>

aspx.cs 代码:

public partial class RefNotes : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            populateNotes();
            Page.Title = "Latest Ref Notes";
        }

        protected void populateNotes()
        {
            string tag = "";
            if (Request.QueryString["tag"] != null) tag = Request.QueryString["tag"];
            int post = 0;
            if (Request.QueryString["post"] != null) post = Int32.Parse(Request.QueryString["post"]);
            MediaService.Article[] articles = Global.mediaService.GetArticles(1, 1); //gets all articles
            for (int i = 0; i < articles.Length; i++)
            {                
                if (post > 0 && articles[i].ID != post) continue;

                Root.Controls.Blog.RefNotesPost p = (Root.Controls.Blog.RefNotesPost)LoadControl("~/Controls/Blog/RefNotesPost.ascx");
                p.SetData(articles[i]);
                refNotes.Controls.Add(p);

                Root.Controls.Blog.CommentControl c = (Root.Controls.Blog.CommentControl)LoadControl("~/Controls/Blog/CommentControl.ascx");
                c.SetData(articles[i].ID);
                refNotes.Controls.Add(c);
            }
            if (articles.Length == 0)
            {
                Literal l = new Literal();
                l.Text = "<h1>No content currently available.</h1>";
                refNotes.Controls.Add(l);
            }
        }
    }

CommentControl.ascx 代码:

@ Control Language="C#" AutoEventWireup="true" CodeBehind="CommentControl.ascx.cs" Inherits="Root.Controls.Blog.CommentControl" %>

<div class="row">
    Comments:
    <asp:Panel ID="errorPanelID" runat="server" CssClass="loginbox-textbox" Visible="false" Style="margin-top: 20px;">
        <div class="alert alert-danger fade in">
            <button class="close" data-dismiss="alert">
                ×
            </button>
            <i class="fa-fw fa fa-times"></i>
            <asp:Label ID="errorMsgID" runat="server"></asp:Label>
        </div>
    </asp:Panel>
</div>
<div id="dvAccordion" style="width: auto">
    <asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <h3>
                <asp:Label ID="Label1" runat="server" Text='<%#Eval("user") + " at " + Eval("dateTime") + " says:"%>'></asp:Label></h3>

            <div style="background-color: #CFDEE3">
                <asp:Literal ID="lit" runat="server" Text='<%#Eval("comment")%>' Mode="Transform" />
            </div>
        </ItemTemplate>
    </asp:Repeater>
</div>
<div>
    Add a Comment:<br />
    <asp:TextBox ID="txtComment" runat="server" Rows="5" TextMode="MultiLine"></asp:TextBox>
    <br />
    <asp:Button ID="Button1" runat="server" OnClick="saveBtn_Click" Text="Submit " />
    <asp:HiddenField runat="server" ID="articleID" Value="0" />

</div>
<script type="text/javascript">
    $(function () {
        $("#dvAccordion").accordion();
    });
</script>

CommentControl.ascx.cs 代码:

public partial class CommentControl : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }        

        public void SetData(int artID)
        {
                Services.Comment[] comments = Global.Tools.GetComments(artID);

            articleID.Value = artID.ToString();
            if (comments.Length > 0)
            {               
                Repeater1.Visible = true;
                Repeater1.DataSource = comments;
                Repeater1.DataBind();
            }
            else
            {
                Repeater1.Visible = false;
            }            
        }        

        protected void saveBtn_Click(object src, EventArgs e)
        {
                AdminService.Employee emp = Global.Tools.GetEmployee(Int32.Parse(Session["eid"].ToString()));
                Blog.Comment a = new Blog.Comment();
                a.CommentOn = txtComment.Text;
                a.CreatedBy = emp.username;
                a.DatePosted = DateTime.Now;
                a.isVisible = 1;
                a.ArticleID = int.Parse(articleID.Value);

                if (Request.QueryString["post"] != null)
                {
                    a.ID = Int32.Parse(Request.QueryString["post"]);
                }

                int result = Global.Tools.CreateComment(a);

                if (result <= 0)
                {
                    errorMsgID.Text = "Failed to create comment.";
                    errorPanelID.Visible = true;
                }
                else
                {                   
                      Response.Redirect("/News.aspx");
                }
            }
            txtComment.Text = string.Empty;     

    }

【问题讨论】:

  • post 和 article[i].Id 是什么?他们会改变吗?
  • 我在另一个用户控件中执行以下操作:editBtn.NavigateUrl = "/Post.aspx?post=" + a.ID;所以我可以跟踪正在编辑的文章。因为我可以在没有 jQuery Accordion 的情况下让所有 cmets 显示出来,所以我对这个 jQuery 插件本身持怀疑态度!
  • 问题可能出在这一行:if (post &gt; 0 &amp;&amp; articles[i].ID != post) continue;。您应该使用调试器逐步了解在这种情况下发生了什么。
  • 好吧,在这一行中 post = 0 和 article[i].ID = 每篇文章的不同 ID。所以,我没有看到任何问题!虽然我可以注释掉这行,这又不会改变任何东西!
  • 所以,我想出了问题所在(我猜很简单):在我的 CommentControl.ascx 文件中,我根据 id (#dvAccordion) 设置了手风琴。我将其更改为基于类 (.dvAccordion) 并解决了问题。所以为了将来的参考:当你在一个页面上时,一个“id”只能被调用一次,但一个“类”可以被多次调用!

标签: c# asp.net jquery-plugins postback asprepeater


【解决方案1】:

在 CommentControl.ascx 文件中,我根据 id (#dvAccordion) 设置了手风琴。我将其更改为基于类 (.dvAccordion) 并解决了问题。

所以为了以后的参考:当你在一个页面上时,一个“id”只能被调用一次,但一个“类”可以被多次调用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多