Можно добавить bindingRedirect элемент к конфигурационному файлу для определения, какую версию блока Вы хотите использовать во времени выполнения.
Вы всегда можете создать унаследованный класс страницы, у которого есть собственный метод OnLoad / OnUnload, который добавляет в немедленный запуск javascript.
Тогда вам не нужно обрабатывать его на уровне управления а скорее уровень формы / страницы.
Интересно, но... почему бы вам не сделать все с jQuery?
var defaultSubmitControl = false;
var dirty = false;
$(document).ready(function( ) {
$('form').submit(function( ) { dirty = false });
$(window).unload(function( ) {
if ( dirty && confirm('Save?') ) {
__doPastBack(defaultSubmitControl || $('form :submit[id]').get(0).id, '');
}
});
});
···
dirty = true;
···
Теперь, если это все еще вызывает ту же самую проблему (выгрузка
срабатывание перед отправкой
), вы можете попробовать другое дерево событий , так что вместо прямого вызова __doPostBack
вы делаете...
setTimeout(function( ) {
__doPastBack(defaultSubmitControl || $('form :submit[id]').get(0).id, '');
}, 1); // I think using 0 (zero) works too
Я не пробовал этого, и это с самого начала, но я думаю, что это может быть способ решить проблему.
Я тоже присматриваю за этим, но на данный момент я нашел решение, которое использует все элементы управления html вместо веб-элементов управления asp.net, вы думаете об этом?
<script type="text/javascript">
$(document).ready(function () {
$("form").dirty_form();
$("#btnCancel").dirty_stopper();
});
</script>
Это работает, в основном отслеживая положение мыши. Имейте в виду, что вы все еще можете получить положительные значения для вашего значения Y (отсюда моя строка кода < 50), но пока ваши кнопки отправки находятся более чем на 100 пикселей вниз, все должно быть в порядке.
Вот Javascript, который я добавил для отслеживания изменений мыши и захвата события onbeforeunload:
<script language="JavaScript1.2">
<!--
// Detect if the browser is IE or not.
// If it is not IE, we assume that the browser is NS.
var IE = document.all?true:false
// If NS -- that is, !IE -- then set up for mouse capture
if (!IE) document.captureEvents(Event.MOUSEMOVE)
// Set-up to use getMouseXY function onMouseMove
document.onmousemove = getMouseXY;
// Temporary variables to hold mouse x-y pos.s
var tempX = 0
var tempY = 0
// Main function to retrieve mouse x-y pos.s
function getMouseXY(e) {
if (IE) { // grab the x-y pos.s if browser is IE
tempX = event.clientX + document.body.scrollLeft
tempY = event.clientY + document.body.scrollTop
} else { // grab the x-y pos.s if browser is NS
tempX = e.pageX
tempY = e.pageY
}
// catch possible negative values in NS4
if (tempX < 0){tempX = 0}
if (tempY < 0){tempY = 0}
// show the position values in the form named Show
// in the text fields named MouseX and MouseY
document.Show.MouseX.value = tempX
document.Show.MouseY.value = tempY
return true
}
//-->
</script>
<script type="text/javascript">
window.onbeforeunload = HandleOnClose;
function HandleOnClose(e) {
var posY = 0;
var elem = document.getElementsByName('MouseY');
if (elem[0]) {
posY = elem[0].value;
}
if (posY < 50) { // Your form "submit" buttons will hopefully be more than 100 pixels down due to movement
return "You have not selected an option, are you sure you want to close?";
}
}
</script>
Затем просто добавьте следующую форму на свою страницу:
<form name="Show">
<input type="hidden" name="MouseX" value="0" size="4">
<input type="hidden" name="MouseY" value="0" style="display:block" size="0">
</form>
И готово! Можно было бы немного почистить (удалить MouseX и т. д.), но это сработало в моем существующем приложении ASP.net 3.5, и я подумал, что опубликую, чтобы помочь кому-нибудь. Работает в IE 7 и Firefox 3.6, Chrome еще не пробовал.