SelectedIndexChange未正确触发

时间:2015-09-08 13:06:44

标签: c# asp.net mono

我希望有人可以帮助我,因为我正试图找出问题所在。我有一个数据绑定CheckboxList,它连接了SelectedIndexChanged事件。 AutoPostBack等于true,ViewStateMode和EnableViewState分别设置为“Enabled”和“True”。我在同一页面上有其他控件,服务器端事件可以正常启动而没有问题。

奇怪的是,事件SEEMS要​​触发,因为当我检查列表中的一个项目时,我可以看到页面重新加载。但是,当我在方法上设置一个调试点时,调试器永远不会进入该部分并且我的代码都没有被触发(我甚至试图写出愚蠢的消息只是为了看看该方法是否正在触发 - 它不是)。这是标记:

<asp:CheckBoxList id="chkLanguages" runat="server" AutoPostBack="true" ViewStateMode="Enabled" EnableViewState="true" data-paramname="lcid"
                                      OnSelectedIndexChanged="chkLanguages_SelectedIndexChanged" />

这是SelectedIndexChanged事件:

protected void chkLanguages_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Do all the things
    }

我错过了什么?我觉得它一定是明显的东西,但对于我的生活,我看不到它。

另外我应该注意到这是最新版本的Mono所以可能会有一些奇怪的怪癖导致这个问题。

最后要注意的是,如果我检查浏览器开发人员工具,控制台中没有错误,因此我没有任何奇怪的javascript内容会导致问题。

更新 因为有问题,我发布了整个页面标记和必要的代码隐藏。

标记:

<%@ 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);
        }

    }
}

1 个答案:

答案 0 :(得分:0)

我无法找到问题的确切原因。每种其他类型的控件都能够回发事件,我可以正确地处理他们的事件服务器端。我最终解决了这个特殊问题,方法是删除CheckBoxList并将其替换为使用项目模板将值存储在隐藏字段中的gridview,然后显示我可以处理OnCheckedChanged事件的复选框(参见下面的代码)。这非常出色。

加价

 <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 ();
    }

我猜这个问题可能是Mono框架中一些奇怪的,深奥的错误。就像我说的,我没有任何其他控件的问题(我测试了很多 - 他们所有的服务器端事件都处理得很好);这只是CheckBoxList的一个问题。