C# SelectedIndexChange未正确触发

C# SelectedIndexChange未正确触发,c#,asp.net,mono,C#,Asp.net,Mono,我希望有人能帮助我,因为我正在努力解决这个问题。我有一个数据绑定的复选框列表,其中连接了SelectedIndexChanged事件。AutoPostBack等于true,ViewStateMode和EnableViewState分别设置为Enabled和true。我在同一个页面上有其他控件,这些控件具有服务器端事件,可以正常启动,没有问题 奇怪的是,事件似乎正在触发,因为当我检查列表中的一个项目时,我可以看到页面重新加载。然而,当我在该方法上设置调试点时,调试器从未进入该部分,我的代码也没有触

我希望有人能帮助我,因为我正在努力解决这个问题。我有一个数据绑定的复选框列表,其中连接了SelectedIndexChanged事件。AutoPostBack等于true,ViewStateMode和EnableViewState分别设置为Enabled和true。我在同一个页面上有其他控件,这些控件具有服务器端事件,可以正常启动,没有问题

奇怪的是,事件似乎正在触发,因为当我检查列表中的一个项目时,我可以看到页面重新加载。然而,当我在该方法上设置调试点时,调试器从未进入该部分,我的代码也没有触发过。我甚至尝试让它写出愚蠢的消息,只是为了看看该方法是否触发过——事实并非如此。以下是标记:

<asp:CheckBoxList id="chkLanguages" runat="server" AutoPostBack="true" ViewStateMode="Enabled" EnableViewState="true" data-paramname="lcid"
                                      OnSelectedIndexChanged="chkLanguages_SelectedIndexChanged" />
我错过了什么?我觉得这一定是显而易见的,但就我个人而言,我看不到

我还应该注意到,这是在最新版本的Mono中,所以可能有一些奇怪的怪癖导致了这个问题

最后一点要注意的是,如果我检查浏览器开发人员工具,那么控制台中不会出现错误,这样我就不会出现任何导致问题的奇怪javascript内容

更新 既然有人问过,我就发布整个页面的标记和必要的代码隐藏

标记:

代码隐藏:


我始终无法找到问题的确切原因。所有其他类型的控件都能够发布回发事件,我可以在服务器端正确处理它们的事件。我最终解决了这个特殊问题,剥离了复选框列表,并将其替换为gridview,该gridview使用一个项模板将值存储在一个隐藏字段中,并显示复选框,在该复选框中我可以处理OnCheckedChanged事件,请参见下面的代码。这项工作做得很出色

加价


我猜问题可能是Mono框架中的一些奇怪的、深奥的bug。就像我说的,我测试过的其他控件都没有问题——它们的服务器端事件都处理得很好;这只是检查框列表的一个问题

data paramname=lcid标记有效吗?是-它是HTML5参数。所有ASP.NET控件都支持这种类型的标记。我在页面上的其他位置使用它,没有问题。请在page_load中设置断点。检查它是否为firingYes,page_load是否正在启动,IsPostBack=true,如预期的那样。但我的事件处理程序似乎没有启动。
protected void chkLanguages_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Do all the things
    }
<%@ Page Language="C#" MasterPageFile="~/pages/master/main.master" Inherits="Letters.Web.UI.searchLetters" AutoEventWireup="true" %>

<asp:Content runat="server" ContentPlaceHolderID="additionalCSS">
<link rel="stylesheet" type="text/css" href="<%= Page.ResolveClientUrl("~/resources/css/letters.css") %>" />
<link rel="stylesheet" type="text/css" href="<%= Page.ResolveClientUrl("~/resources/css/font-awesome.min.css") %>" />
<link rel="stylesheet" type="text/css" href="<%= Page.ResolveClientUrl("~/resources/css/bootstrap.css") %>" />
<link rel="stylesheet" type="text/css" href="<%= Page.ResolveClientUrl("~/resources/css/bootstrap-multiselect.css") %>" />
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="additionalJS">
<script type="text/javascript" 
    src="<%= Page.ResolveClientUrl("~/resources/javascript/bootstrap.min.js") %>">
</script>
<script type="text/javascript" 
    src="<%= Page.ResolveClientUrl("~/resources/javascript/bootstrap-multiselect.js") %>">
</script>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="mainContent">

        <section id="search-header">
            <div class="column">
                <div class="field-set">
                    <asp:Label id="lblTextString" runat="server" CssClass="data-label">Search for Letters</asp:Label>
                    <div class="data-control">
                        <asp:TextBox id="txtTextString" Width="100%" runat="server" CssClass="form-control searchable" placeholder="Contains Text" data-paramname="textString" />
                    </div>
                </div>
            </div>
            <div class="column-small">
                <div class="field-set">
                    <span class="data-label">&nbsp;</span>
                    <div class="data-control">
                        <button id="btnSearch" runat="server" class="search-nav-buttons" onserverclick="Search_Click">
                            Search
                        </button>
                    </div>
                </div>
            </div>

        </section>

        <asp:PlaceHolder id="plcSearchResults" runat="server">
        <section id="search-results">
            <div class="filter-options">
                <table>
                    <tbody>
                        <tr class="searchresults-headerstyle">
                            <th scope="col" class="header">Filter Options</th>
                        </tr>
                    </tbody>
                </table>
                <asp:Panel id="pnlLanguage" runat="server">
                    <h1>Languages</h1>
                    <asp:HiddenField id="hdlLanguages" runat="server" />
                    <asp:CheckBoxList id="chkLanguages" runat="server" AutoPostBack="true" ViewStateMode="Enabled" EnableViewState="true" data-paramname="lcid"
                                      OnSelectedIndexChanged="chkLanguages_SelectedIndexChanged" />
                </asp:Panel>
            </div>
            <asp:GridView id="grvResults" runat="server" CssClass="table table-striped table-bordered" AutoGenerateColumns="false" 
                          AllowPaging="true" AllowSorting="true" Width="70%" GridLines="None"
                          OnPageIndexChanging="GridView_PageIndexChanging" >
                <HeaderStyle CssClass="searchresults-headerstyle" />
                <FooterStyle CssClass="searchresults-footerstyle" />
                <PagerStyle CssClass="pagination-style" />
                <Columns>
                    <asp:TemplateField HeaderText="Search Results" >
                        <ItemTemplate>
                            <div class="search-result-record">
                                <asp:HyperLink runat="server" NavigateUrl='<%# Eval("LetterUrl") %>' Text='<%# Letters.Tools.WebUtils.HtmlEncode(Eval("Title").ToString()) %>' />
                                <span>(<%# Eval("Language") %>)</span>
                                <span class="keywords">Keywords: <%# Eval("Categories") %></span>
                                <asp:Label runat="server" CssClss="language" Visible='<%# Eval("LCID").ToString() != "en" %>'>Language: <%# Eval("Language") %></asp:Label>
                                <div class="search-abstract">
                                    <%# Eval("SearchAbstract") %>
                                </div>
                            </div>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </section>
        </asp:PlaceHolder>


</asp:Content>
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;

using Letters.Domain.Objects;
using Letters.Tools;

namespace Letters.Web.UI
{
    public partial class searchLetters : System.Web.UI.Page
    {       
        #region eventhandlers
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack) {
                this.BindResults ();
            }
        }

        protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grvResults.PageIndex = e.NewPageIndex;
            this.BindResults ();
        }

        protected void chkLanguages_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.hdlLanguages.Value = this.GetSelectedItems (this.chkLanguages);
            this.FilterResults ();
        }

        protected void Search_Click(object sender, EventArgs e)
        {
            Dictionary<string, object> parameters = new Dictionary<string, object> ();

            if (!string.IsNullOrEmpty (this.txtTextString.Text))
                parameters.Add (this.txtTextString.Attributes ["data-paramname"].ToString (), this.txtTextString.Text);

            this.BindResults (parameters);
        }
        #endregion
        private void FilterResults()
        {
            Dictionary<string, object> parameters = new Dictionary<string, object> ();
            if (pnlLanguage.Visible) {
                parameters.Add (this.chkLanguages.Attributes ["data-paramname"].ToString (), this.GetSelectedItems (this.chkLanguages));
            }

            //Finally, add the search string
            if (!string.IsNullOrEmpty (this.txtTextString.Text))
                parameters.Add (this.txtTextString.Attributes ["data-paramname"].ToString (), this.txtTextString.Text);

            this.BindResults (parameters);
        }

        private string[] GetFilterOption(string delimitedValue)
        {
            string[] result = null;
            if (delimitedValue.Contains (",")) {
                result = delimitedValue.Split (new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            } else
                result = new string[] { delimitedValue };

            return result;
        }

        private string GetSelectedItems(CheckBoxList list)
        {
            StringBuilder result = new StringBuilder ();
            foreach (ListItem item in list.Items) {
                if (item.Selected)
                    result.Append (item.Value).Append (",");
            }

            if (result.Length > 0) {
                result.Remove (result.Length - 1, 1);
                return result.ToString ();
            }
            else
                return null;
        }

        private string GetSelectedItems(ListBox list)
        {
            StringBuilder result = new StringBuilder ();
            foreach (ListItem item in list.Items) {
                if (item.Selected)
                    result.Append (item.Value).Append (",");
            }

            if (result.Length > 0) {
                result.Remove (result.Length - 1, 1);
                return result.ToString ();
            }
            else
                return null;
        }

        private void PopulateFilters(List<SearchResult> results)
        {
            var languages = (from x in results
                            group x by new { x.LCID, x.Language } into counts
                            select new { Key = counts.Key.LCID, DisplayName = string.Format("{0} ({1})", counts.Key.Language, counts.Count())  }
                            ).ToList();

            this.chkLanguages.DataSource = languages;
            this.chkLanguages.DataTextField = "DisplayName";
            this.chkLanguages.DataValueField = "Key";
            this.chkLanguages.DataBind ();

            if (!string.IsNullOrEmpty (hdlLanguages.Value)) {
                string[] languageSelect = this.GetFilterOption (hdlLanguages.Value);
                foreach (ListItem item in this.chkLanguages.Items) {
                    if (languageSelect.Contains (item.Value))
                        item.Selected = true;
                }
            }

        }

        private void BindResults()
        {
            List<SearchResult> results = this.GetSearchResults ();
            this.grvResults.DataSource = results;
            this.grvResults.DataBind ();

            this.PopulateFilters (results);
        }

        private void BindResults(Dictionary<string, object> parameters)
        {
            List<SearchResult> results = this.GetSearchResults(parameters);
            this.grvResults.DataSource = results;
            this.grvResults.DataBind ();

            this.PopulateFilters (results);
        }

        private void RegisterEvents()
        {
            this.grvResults.PageIndexChanging += new System.Web.UI.WebControls.GridViewPageEventHandler (GridView_PageIndexChanging);
        }

        private List<SearchResult> GetSearchResults()
        {
            return LetterService.GetSearchResults ();
        }

        private List<SearchResult> GetSearchResults(Dictionary<string, object> parameters)
        {
            return LetterService.GetSearchResults (parameters);
        }

    }
}
 <asp:GridView id="grvLanguages" runat="server" ShowHeader="false" ShowFooter="false" AllowPaging="false" 
               AllowSorting="false" GridLines="None" AutoGenerateColumns="false" data-paramname="languages" >
     <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:HiddenField id="hdlValue" runat="server" Value='<%# Eval("Key") %>' />
                <asp:CheckBox id="chkDisplay" runat="server" Text='<%# Eval("DisplayName") %>' OnCheckedChanged="chkLanguage_SelectedIndexChanged" AutoPostBack="true" />
            </ItemTemplate>
        </asp:TemplateField>
     </Columns>
 </asp:GridView>
 protected void chkLanguage_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.hdlLanguages.Value = this.GetSelectedItems (this.grvLanguages);
        this.FilterResults ();
    }