ASP.NET按钮未设置UseSubmitBehavior="false"时无法触发OnClick事件

3

我遇到了与 asp.net 按钮控件和下拉列表有关的问题。

我有一个名为 ApplyButton 的按钮和一个名为 FilterCombo 的下拉列表。

<asp:Button ID="ApplyButton" runat="server" Text="Apply Filter" OnClick="ApplyButton_Click" />

<asp:DropDownList ID="FilterCombo" runat="server" ></asp:DropDownList>

我想在应用按钮 (ApplyButton) 的 OnClick 事件中使用我的下拉列表 (FilterCombo) 的 SelectedIndex 调用一个接受 int 参数的方法。但是当我点击该按钮时,按钮的 Onclick 事件不会触发。如果我将按钮的 UseSubmitBehavior="false",则它可以触发。

<asp:Button ID="ApplyButton" runat="server" Text="Apply Filter" OnClick="ApplyButton_Click" UseSubmitBehavior="false" />

现在OnClick方法可以正常触发。但问题是FilterCombo.SelectedIndex总是返回0。为什么我不能在不设置UseSubmitBehavior="false"的情况下触发Onclick事件,而且我如何获取FilterCombo的正确SelectedIndex?

以下是Page_Load的后端代码:

protected void Page_Load(object sender, EventArgs e)
{
    LeftSideBarHolder.Controls.Add(Page.LoadControl("~/Pages/Common_wa/LeftPanel.ascx"));
    HeaderHolder.Controls.Add(Page.LoadControl("~/Pages/Common_wa/Header.ascx"));

    try
    {
        string columns = Request["columns"];
        string[] arr = columns.Split(';');
        pkey = bool.Parse(arr[0]);
        leader = bool.Parse(arr[1]);
        type = bool.Parse(arr[2]);
        level = bool.Parse(arr[3]);
        state = bool.Parse(arr[4]);
        dueDate = bool.Parse(arr[5]);
    }
    catch (Exception ex)
    {
        //do nothing : This is the parameterless request
    }

    if (!IsPostBack)
    {
        Owner = int.Parse(Session["userID"].ToString());
        ViewState["PreviousPage"] = Request.UrlReferrer;
        LoadFilters();

        if (pkey) pKeyCheckBox.Checked = true;
        if (leader) LeaderCheckBox.Checked = true;
        if (type) TypeCheckBox.Checked = true;
        if (level) LevelCheckBox.Checked = true;
        if (state) StateCheckBox.Checked = true;
        if (dueDate) DueDateCheckBox.Checked = true;
    }
    try
    {
        DTO.Search.SearchResult SearchResult_new = (DTO.Search.SearchResult)Session["SearchResults"];
        Result = SearchResult_new.Result;
    }
    catch (Exception ex)
    {

    }
}

LoadFilters()代码-用于将数据加载到FilterCombo中。

private void LoadFilters()
{
    SearchUtils util = new SearchUtils();
    int Owner = int.Parse(Session["userID"].ToString());

    DataSet filters = util.GetFiltersOfOwner_AsDataSet(Owner);
    FilterCombo.DataSource = filters;
    FilterCombo.DataValueField = "Id";
    FilterCombo.DataTextField = "Name";
    FilterCombo.DataBind();
}

应用按钮的OnClick事件

protected void ApplyButton_Click(object sender, EventArgs e)
{
    SearchUtils util = new SearchUtils();
    int Id = int.Parse(FilterCombo.SelectedItem.Value.ToString());
    SearchFilter filter = util.GetFilter(Id);
    string Columns = filter.Columns;
    string[] arr = Columns.Split(';');
    pkey = bool.Parse(arr[0]);
    leader = bool.Parse(arr[1]);
    type = bool.Parse(arr[2]);
    level = bool.Parse(arr[3]);
    state = bool.Parse(arr[4]);
    dueDate = bool.Parse(arr[5]);
    Response.Redirect("SearchResult_new.aspx?columns=" + pkey + ";" + leader + ";" + type + ";" + level + ";" + state + ";" + dueDate + "");
}

更新:我认为我找到了原因。但不知道解决方法... 我的ButtonDropDownList在一个Div中,该Div作为一个jQuery Dialog工作,并由一个JavaScript函数调用。

<%-- Load Filter Dialog Box --%>
<div id="loadFilterDialog" title="Apply Filter" style="display: none">
    <div class="BodyPanelDiv">
        <asp:DropDownList ID="FilterCombo" runat="server"></asp:DropDownList>
    </div>
    <div class="BottomPanelDiv" align="Right">
        <asp:Button ID="ApplyButton" runat="server" Text="Apply Filter" OnClick="ApplyButton_Click" UseSubmitBehavior="false" />
        <asp:Button ID="CancelButton2" runat="server" Text="Cancel" OnClientClick="return closeDialog(2); return false;" />
    </div>
</div>
<%-- End of Load Filter Dialog Box --%>

这里是调用对话框的JavaScript代码

//Display JQuery Dialog 
function showDialog() {
    $("#loadFilterDialog").dialog({
        draggable: true,
        resizable: false,
        width: 350,
        height: 150,
        minHeight: 10,
        minwidth: 10
    });
    return false;
}

展示你的代码后台文件。你是如何绑定你的组合框的? - Krishnraj Rana
感谢回复。请检查包含@KrishnrajRana的后端代码。 - Chamithra Thenuwara
@sr28 - 是的。之前我尝试使用 int index=FilterCombo.SelectedIndex; 获取值,然后使用 FilterCombo.Items[index].Value; 但两者都没有起作用。 - Chamithra Thenuwara
通过将“UseSubmitBehavior”设置为false,您告诉.Net框架插入自己的JS脚本来处理回发,而不是让浏览器处理提交。您的浏览器中是否显示任何脚本错误可能会干扰或在单击提交按钮时出现?您能否在新的空白独立测试页面上设置UseSubmitBehaviour=true以查看是否可以在单击按钮时进行回发?如果这样可以,请尝试添加基本下拉列表以确保所选索引正确,并从那里构建它。 - Radderz
@Radderz - 我想我找到了原因。但是不知道解决方案...我的按钮和下拉列表在一个Div中,该Div作为jQuery对话框工作,由JavaScript函数调用。请检查更新后的代码... - Chamithra Thenuwara
显示剩余5条评论
1个回答

3

这个答案已经被我收藏了。要使用jQuery对话框进行.Net postbacks,您需要在表单中进行操作。好消息是这很容易解决;但我将此解决方案收藏,因为它有点晦涩。

jQuery UI对话框与ASP.NET按钮postback

所以你的上面的代码变成了:

//Display JQuery Dialog 
function showDialog() {
  $("#loadFilterDialog").dialog({
    draggable: true,
    resizable: false,
    width: 350,
    height: 150,
    minHeight: 10,
    minwidth: 10
  });
  $("#loadFilterDialog").parent().appendTo($("form:first"));

  return false;
}

感谢回复。请检查包含的后端代码。 - Chamithra Thenuwara
appendTo($("form:first"))。你能解释一下这个 "form:first" 部分吗?我对这些东西还是新手。 - Chamithra Thenuwara
1
为了使.Net回发正常工作,必须将JQuery对话框添加到表单中。我认为这是分开的,以便JQuery对话框可以控制/锁定UI,处理自定义按钮并防止用户提交其他按钮(我可能理解有误,因为它仍然成功地阻止了UI)。无论如何,该系统的某些内部将表单数据分离,从而防止了.Net回发。即使使用“UseSubmitBehavior=False”强制进行回发,仍会阻止数据传递到后端,因为它存在于.Net表单之外。 - Radderz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接