Вызов OnClientClick кнопки в коде позади

У меня есть кнопка на моей веб-странице aspx, которую нужно «щелкнуть» в моем коде за кодом С #. Затем метод OnClientClick вызывает диалоговое окно подтверждения JS, и поэтому функция btn_Click запускается только тогда, когда пользователь нажимает «ОК» ...

Пока это мой код: Вариант 1

aspx:

<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_Click" />

aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
       // set OnClientClick 
       btnConfirm.OnClientClick = "confirm('Save in DB?');";

       // invoke method
       Type t = typeof(System.Web.UI.WebControls.Button);
       object[] p = new object[1];
       p[0] = EventArgs.Empty;
       MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);
       m.Invoke(btnConfirm, p);
}
protected void btnConfirm_Click(object sender, EventArgs e)
    {
        //save something in database
    }

Получил образцы кода от: http://forums.asp.net/t/1046550.aspx?How+do+you+raise+a+button+click+event+from+outside+the+button+

Я хочу вызвать метод OnClientClick, но когда я заменяю OnClick на OnClientClick, появляется эта ошибка:

Исключение System.NullReferenceException не было обработано пользовательским кодом. Сообщение = Ссылка на объект не установлена ​​на экземпляр объекта.

Изменить: Вариант 2:

Я пытался переписать свою программу так: aspx:

<script language="javascript">
function invokeButtonClick() {
        document.getElementById("btnConfirm").click();
    }

    function Validate() {
        return confirm('Save in db?');
    }
</script>
<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_Click" OnClientClick="return Validate();" />

aspx: cs:

protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "InvokeButton", "invokeButtonClick();", true);
}

protected void btnConfirm_Click(object sender, EventArgs e)
{
   // save something in database
}

Но затем обратная передача страницы перед вызовом моей функции btnConfirm_Click ...

Спасибо,

Майкл


person ZerOne    schedule 27.02.2015    source источник


Ответы (3)


Если OnClientClick имеет возвращаемое значение истина, тогда будет срабатывать событие кода позади OnClick. Если OnClientClick возвращается false, то этого не происходит.

Если OnClientClick ничего не возвращает, событие codebehind срабатывает независимо. Так ты хочешь ..

<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_Click" />

<script language="javascript">
    function Validate() {
        return confirm('Save in db?');
    }
</script>

Код позади:

protected void Page_Load(object sender, EventArgs e)
{
   // set OnClientClick 
   btnConfirm.OnClientClick = "return Validate();";
}

protected void btnConfirm_Click(object sender, EventArgs e)
{
    //save something in database
}

ОБНОВИТЬ:

Этот пост привлек мое внимание, не знаю, почему я не включил его в свой исходный пост, но вы можете использовать OnClientClick в теге aspx:

<asp:Button runat="server" ID="btnConfirm" OnClientClick="return Validate();" Text="Confirm" OnClick="btnConfirm_Click" />

<script language="javascript">
    function Validate() {
        return confirm('Save in db?');
    }
</script>
person Hugo Yates    schedule 27.02.2015
comment
Проблема, которая здесь возникла, заключается в том, что обратная передача страницы до того, как данные будут сохранены в базе данных ... поэтому некоторые данные отсутствуют, и выскакивает ошибка - person ZerOne; 27.02.2015
comment
Я немного запутался. Вы пытаетесь выполнить обратную передачу, отобразить сообщение, а затем снова выполнить обратную передачу? - person Hugo Yates; 27.02.2015
comment
Поэтому для отладки я помещаю несколько предупреждений в код, и вот результат: при загрузке сайта код вызывает функцию JS, которая имитирует щелчок. Пока все хорошо, появляется окно подтверждения события OnClientClick. Но затем после того, как пользователь нажал «ок» или «отменить», код прошел до конца кода. Веб-страница перезагружается и, по крайней мере, появляется предупреждение в функции btnConfirm_Click. Так почему же btnConfirm_Click не вызывается сразу после завершения события OnClientClick? - person ZerOne; 27.02.2015
comment
Или можно предотвратить обратную передачу кнопки, но все же вызвать подтверждение JS, а затем, если пользователь нажмет кнопку ОК, вызвать метод кода? - person ZerOne; 27.02.2015
comment
Именно это и делает приведенный выше код. используя return в OnClientClick, если пользователь нажимает кнопку «Отменить», обратная передача не происходит. Я думаю, что, возможно, вам нужно вырезать какой-то код, поскольку, похоже, у вас возникает противоречивая логика. - person Hugo Yates; 27.02.2015
comment
Мне вообще не нужна обратная передача. Я хочу: 1) Вызвать JS-функцию, чтобы открыть окно с подтверждением. 2) Если пользователь щелкнет ОК: вызовите функцию C # для сохранения в БД, если пользователь нажмите "Отмена", ничего не делайте .. - person ZerOne; 27.02.2015
comment
Да, вам нужна обратная передача, иначе вы никогда не доберетесь до функции C # - person Hugo Yates; 27.02.2015
comment
Итак, нет возможности вызвать функцию C # из JS-кода? И это нормальное поведение, когда обратная передача происходит сразу после события OnClientClick и до срабатывания события OnClick? normal Проблема при обратной передаче состоит в том, что некоторые переменные в C # теряются. - person ZerOne; 27.02.2015
comment
Вы можете, но это довольно запутанный вопрос, и это не ваш исходный вопрос. Если вы теряете переменные между обратной передачей, у вас есть 3 варианта; используйте Session или ViewState или поместите переменные внутри HiddenFields, но опять же, все это отличается от вашего исходного вопроса. - person Hugo Yates; 27.02.2015
comment
да, так что спасибо за вашу помощь. Постараюсь самостоятельно решить новую проблему;) - person ZerOne; 27.02.2015

Вам нужно добавить оба события при нажатии кнопки. OnClientClick обрабатывает код сценария на стороне клиента, а OnClick обрабатывает вызов событий на стороне сервера.
Итак, добавьте оба события и их обработчики. NullReferenceException, который вы получаете из-за этого.

<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_Click" OnClientClick="return Validate();" />

и в вашем javascript коде может быть

function Validate(){
     if (valied())
        return true;
    return false;
}
person Mahesh    schedule 27.02.2015
comment
Может ли метод OnClientClick не задан в коде, как в моем вопросе выше? - person ZerOne; 27.02.2015
comment
Никакое OnClientClick не является событием на стороне клиента, поэтому оно будет обрабатываться на стороне клиента с использованием javascript любой другой функции сценария на стороне клиента. Только событие на стороне сервера будет обрабатываться в коде на стороне сервера, например OnClick. - person Mahesh; 27.02.2015
comment
Что ты пытаешься сделать? Можете ли вы объяснить, почему вы хотите вызывать скрипт на стороне клиента из кода? Так не пойдет? - person Mahesh; 27.02.2015
comment
Я перебираю массив, и в подтверждении должен быть текст вроде подтверждения («Сохранить + sString [i] + в базе данных?») - person ZerOne; 27.02.2015
comment
Теперь я попытался добавить оба события, как вы предложили, но все равно получаю исключение NullReferenceException .. - person ZerOne; 27.02.2015

100% код за подтверждением! Иногда это так раздражает код позади или подтверждение на стороне сервера в asp.net, когда вы хотите что-то удалить или обновить, я получил свое решение после долгого поиска, как показано ниже:

<asp:Button ID="btnSave" runat="server" Text="Save" OnClientClick="return confirm('Are you sure to BLOCK this customer ?')" OnClick="btnSave_Click" />

Теперь всякий раз, когда вы нажимаете эту кнопку, вам будет предложено подтвердить, если вы выберете «НЕТ», страница не будет публиковаться, а если вы выберете «Да», тогда страница будет опубликована, и ваше событие нажатия кнопки будет срабатывать ... как показано ниже

Код позади:

protected void Page_Load(object sender, EventArgs e)
    {
    } 

 // Before coming here,,,there will be confirmation   
 protected void btnSave_Click(object sender, EventArgs e)
    {
      GetCustomerInfo();
    }
person Abdul Khaliq    schedule 04.09.2015