ASP: Флажок, как автостоп только на проверенных? - PullRequest
2 голосов
/ 07 января 2010

У меня есть флажок, который настроен как показано ниже:

<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), но затем оно как-то проверяется снова.

Это не очень большая проблема, так как на самом деле нет причин снимать флажок (поскольку, как я уже говорил, набор данных при проверке является расширенным набором данных без контроля), но я все же хотел бы знать, почему тот. Есть идеи?

Ответы [ 4 ]

5 голосов
/ 07 января 2010

Не устанавливайте AutoPostBack в этом случае. "AutoPostBack" означает отправку на сервер в любое время, когда значение этого элемента управления изменяется ... что НЕ , что вы хотите.

Вместо этого используйте GetPostBackEventReference(myCheckbox,""), чтобы получить соответствующий сценарий обратной передачи и вызвать его из вашего showLoadingScreen метода, если флажок установлен.

0 голосов
/ 20 января 2015

Старайтесь избегать использования _doPostback, поскольку это хак, который вам нужно будет знать, какой идентификатор элемента управления отправляет обратно и другие параметры для этой функции Javascript из Microsoft ASP.NET. Чтобы понять, что происходит за кулисами, вы должны знать, почему существует обратная передача и как предотвратить обратную передачу.

Вот что происходит с флажком ASP.NET (ASP: флажок), когда установлена ​​автоматическая обратная передача:

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

сгенерированный HTML-код:

<input type="checkbox" ... id="..." onclick="return isDoPostback(this.checked);_doPostback(...);" .../>

Настраиваемое событие 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
			}
        }
    }
});
0 голосов
/ 07 января 2010

Попробуйте использовать процедуру JS для проверки, проверена ли она, и если она установлена ​​в значение true, попробуйте выполнить:

_doPostBack (checkElementReference.name, "");

_doPostBack отвечает за выполнение сообщений на сервере для элементов управления, которые обычно не выполняют обратную передачу. Вам нужно передать имя элемента, которое на сервере является свойством UniqueID для серверного флажка.

0 голосов
/ 07 января 2010

Для работы с обработчиком onclick вам необходимо:

return showLoadingScreen(this.checked);
...