【问题标题】:ASP:Checkbox how to autopostback only on checked?ASP:复选框如何仅在选中时自动回发?
【发布时间】:2011-01-02 14:00:37
【问题描述】:

我有一个复选框,设置如下:

<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="showLoadingScreen(this.checked);" AutoPostBack="true" Text="Check me for more data!" /> 

showLoadingScreen函数如下:

function showLoadingScreen(isChecked) {         
if (isChecked)
    {
        document.getElementById('form1').style.display='none';
        document.getElementById('img_loading').style.display='block';
    }
else { return false; }
}

我添加了 else 子句,希望仅在选中复选框时才能将其回发,但无论哪种情况都会发回。

我在页面上有一个网格(在 form1 内),它在页面加载时加载了一组数据,但是为了向其中添加一些额外的数据,我添加了这个复选框(它的运行时间更长过程,所以我只想按需加载,而不是预先加载)。当它被选中时,我想显示加载 gif、回发、抓取数据并返回。如果该框未被选中,我不想做任何事情,因为在页面上留下足够多的数据是完全可以的(也就是说,预先显示的数据是选中复选框时显示的数据的子集)。

有什么办法可以让复选框自动回复选中,而不是取消选中?

编辑:使用 Dark Falcon 的建议,我将复选框修改为:

<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="return showLoadingScreen(this.checked);" AutoPostBack="true" Text="Include HQ Values" /> 

而 javascript 是:

function showLoadingScreen(checked) {         
alert(checked);
if (checked)
    {
        document.getElementById('form1').style.display='none';
        document.getElementById('img_loading').style.display='block';
        document.form1.submit();  //my own addition, to get it to post back
    }
else { return false; }
}

现在,它会在选中后发回消息,但无法再取消选中该框。如您所见,我添加了一个警报以显示传入的值。当您取消选中该框(false)时,它传入了正确的值,但随后又以某种方式再次被选中。

这不是一个大问题,因为真的没有理由取消选中该框(因为正如我之前所说,选中时的数据集是未选中数据集的超集),但我仍然想知道它为什么会这样做那。有什么想法吗?

【问题讨论】:

  • 你的代码在 VS 设计器中的样子并不重要。您需要查看浏览器中的标记以确定如何解决问题。
  • 乔希,请看我的编辑。我听取了您的建议,在浏览器中查看源代码,结果如下所示: 你可以看到以某种方式添加了checked="checked",我觉得尽管javascript返回false,但它仍然处于检查状态。关于如何让它不添加checked="checked"部分的任何想法?
  • 我宁愿建议:取消选中复选框并进行不呈现任何控件的回调。这样可以确保您没有不一致的服务器/客户端控制状态。

标签: asp.net javascript checkbox postback autopostback


【解决方案1】:

在这种情况下不要设置 AutoPostBack。 "AutoPostBack" 表示在此控件的值发生更改的任何时候发回服务器...这不是您想要的。

相反,使用GetPostBackEventReference(myCheckbox,"") 获取适当的回发脚本,如果选中该复选框,则从您的showLoadingScreen 方法调用此脚本。

【讨论】:

  • 我试图弄清楚 GetPostBackEventReference 是如何工作的。在阅读了有关 SO 的其他一些问题之后,我觉得我应该在我的 javascript 函数中使用它,例如: ;但是那我该如何处理那个服务器端呢?在页面加载?我在那里检查什么?
  • 不确定在服务器端处理它是什么意思?这似乎是一个完全正常的回发。将评论中的代码直接粘贴到 showLoadingScreen() 中,取出 AutoPostBack... 然后您将获得您正在寻找的行为。本质上,整个问题是您永远不应该将 AutoPostBack 设置为 true。试图解决这个问题是导致奇怪行为的原因。
【解决方案2】:

尽量避免使用 _doPostback,因为它是一种 hack,您必须知道来自 Microsoft ASP.NET 的 Javascript 函数的回发控件 ID 和其他参数。要了解幕后发生的事情,您必须知道为什么会有回发以及如何防止回发发生。

以下是设置自动回发时 ASP.NET 复选框 (ASP:Checkbox) 发生的情况:

&lt;ASP:Checkbox runat="server" id="chkCheckbox" AutoPostback="true" onclick="return isDoPostback(this.checked);" ClientIdMode="static" ... /&gt;

生成的 HTML 代码是:

&lt;input type="checkbox" ... id="..." onclick="return isDoPostback(this.checked);_doPostback(...);" .../&gt;

自定义的 onclick 事件被附加到复选框的 onclick 事件的开头。无论您做什么,该前置函数调用都会执行。最糟糕的是,如果您有返回值,_doPostback 将永远不会被执行。

这才是你真正想做的(我在这里混合使用了 jQuery 和原生 Javascript):

var checkbox = $("#chkCheckbox");
...

checkbox .on("change", function(e)
{	if(this.checked)
	{
		var isConfirmedToContinue = confirm("Continue with Postback?");

		if(!isConfirmedToContinue)
		{	this.checked = false;	//Uncheck the checkbox since the user canceled out
			var onClickDelegate = this.onclick;

			if(onClickDelegate)
			{	var me = this;
				this.removeEventListener("click", onClickDelegate);	//Remove the onclick event so that auto-postback no longer happens

				setTimeout(function()
				{    //Add back the onclick delegate after 250ms    
                    me.addEventListener("click", onClickDelegate);
				}, 250);

				this.onclick = null; //Remove the current onclick event by nulling it out
			}
        }
    }
});

【讨论】:

    【解决方案3】:

    尝试使用一个JS例程来检查它是否被检查,如果它被设置为true,尝试这样做:

    _doPostBack(checkElementReference.name, "");

    _doPostBack 负责为通常不回发的控件向服务器执行发布。您必须传递元素的名称,该名称在服务器上恰好是服务器端复选框控件的 UniqueID 属性。

    【讨论】:

    • 这里确实需要使用GetPostBackEventReference()。
    • 不,你没有。许多人使用_doPostBack;这是在客户端,所以这是合适的(因为它是在屏幕上呈现的),但我明白你在说什么。但这不是必需的。
    【解决方案4】:

    对于您的 onclick 处理程序,您需要执行以下操作:

    return showLoadingScreen(this.checked);
    

    【讨论】:

    • 天啊!我知道这很简单。但是,它并没有在检查时发回服务器,只发了 Javascript 的东西。所以我添加了“document.form1.submit();”到 javascript 的 If 部分;但现在复选框不会取消选中,哈哈。有什么想法吗?
    猜你喜欢
    • 2022-01-09
    • 2016-09-23
    • 2014-09-27
    • 2021-03-08
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多