Как программно изменить событие OnClientClick и вызвать его?

StackOverflow https://stackoverflow.com/questions/1875233

Вопрос

У меня есть ListView, который содержит списки воспроизведения.Если пользователь хочет отредактировать альбом, он нажимает на ссылку редактировать, и это позволяет ему удалять или добавлять песни в список воспроизведения.Если пользователь хочет сохранить новый список воспроизведения, сохранив при этом исходный, он должен нажать кнопку Сохранить как.Вот что должно произойти:

Если пользователь нажимает Сохранить как и он не изменил имя, я хочу отобразить предупреждение о том, что он должен изменить имя.

Если пользователь нажимает кнопку Сохранить как и изменил имя, я хочу отобразить подтверждение того, что он действительно хочет его сохранить.

В настоящее время происходит следующее: если я добавляю что-то вроде следующего в свой код, скрипт не регистрируется до второго щелчка, и любой зарегистрированный скрипт остается зарегистрированным, что означает, что если я в конечном итоге изменю имя, а сценарий оповещения был зарегистрирован ранее, он отобразит предупреждение вместо подтверждения.Вот этот код:

if (newname == oldname)
{
    btnSaveAs.OnClientClick =
  "javascript:alert('Save As requires you to change the name of the playlist. Please
   change the name and try again.');";
}
else
{
    btnSaveAs.OnClientClick = "javascript:confirm('Are you sure you want to save the
    playlist" + newname + "?');";
}

Я также попытался добавить возвращаемое значение false, чтобы оно не выполняло обратную отправку, но если я это сделаю, то на самом деле оно ничего не делает, когда я нажимаю OK при подтверждении.

Это было полезно?

Решение

То, что сказал SLaks, верно: вы неправильно понимаете жизненный цикл страницы.Код JavaScript должен быть размещен на странице. до вы нажимаете «Сохранить как».В описанном вами примере пользователь вносит изменения в заголовок/имя и нажимает «Сохранить как», после чего к кнопке применяется код JavaScript.Во второй раз, когда они нажмут «Сохранить как», всплывут результаты проверки из предыдущего примера.

Опция 1:Используйте элемент управления валидатора

Самый простой способ решить эту проблему — использовать элемент управления RegularExpressionValidator для сравнения значений.

Фрагмент разметки:

<asp:Label ID="lblName" runat="server" Text="Name: " />
<asp:TextBox ID="txtName" runat="server" />
<asp:RegularExpressionvalidator ID="valName" runat="server" ControlToValidate="txtName" ErrorMessage="You must change the name before saving" Display="Dynamic" />

<asp:Button ID="btnSaveAs" runat="server" OnClick="btnSaveAs_Click" Text="Save As" CausesValidation="True" />

В коде программной части после привязки полей формы (название альбома и т. д.) запустите следующее:

valName.ValidationExpression = string.Format("[^{0}]", Regex.Escape(lblName.Text));

Вышеупомянутое регулярное выражение будет действительным для любого ввода, кроме того, что было в начале.Если пользователь изменит текст названия альбома, кнопка «Сохранить» будет проверена правильно.Если они этого не сделают, валидатор включится и отобразит на странице сообщение о том, что его необходимо изменить.

Затем займитесь OnClick событие кнопки сохранения только для сохранения значений, поскольку оно сработает только в том случае, если страница была проверена:

protected void btnSaveAs_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        //do you save actions as needed
    }
}

Вы также можете использовать поле подтверждения по своему усмотрению, выполнив следующие действия:

protected void Page_Load(object sender, EventArgs e)
{
    btnSave.OnClientClick = "return confirm('Are you sure you wish to change the name?');";
}

Вышеупомянутое должно работать нормально.Альтернативный подход указан ниже:

Вариант 2:Используйте функцию проверки на стороне клиента

Если вы хотите выполнить проверку полностью на стороне клиента, вы можете это сделать, но это будет намного сложнее.Что вам нужно сделать, так это зарегистрировать полностью клиентскую функцию проверки.

В вашем коде во время Page_PreRender:

protected void Page_PreRender(object sender, EventArgs e)
{
    //define the script
    string script = @"

    function validateAlbumName(oldName, textBoxId) {

        //get the textbox and its new name
        var newName = document.GetElementById(textBoxId).value;

        //compare the values 
        if (newName === oldName) {
            //if the name hasn't changed, 
            alert('You must change the name of the album');
            return false;
        }

        return confirm ('Are you sure you want to save the playlist ' + newName);  
    }

    ";

    //register the client script, so that it is available during the first page render
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SaveAsValidation", script);

    //add the on client click event, which will validate the form fields on click the first time.
    btnSaveAs.OnClickClick = string.Format("return validateAlbumName('{0}','{1}');", txtAlbumName.Text, txtAlbumName.ClientID);

}

Надеюсь это поможет.Вероятно, в приведенном выше тексте есть некоторые синтаксические ошибки, поскольку я просто быстро собрал это.

Другие советы

Тот Самый OnClientClick свойство - это строка Javascript, а не URI.Поэтому вам не следует начинать его с javascript:.

Чтобы справиться с confirm правильно, пишите OnClientClick = "return confirm('Are you sure?');";

Кроме того, вы неправильно понимаете ASP.Net модель страницы.

Выполняется только ваш обработчик событий, основанный на коде C # после пользователь нажимает на кнопку и после тот самый OnClientClick обратный звонок.Вам нужно написать все это на Javascript и вызвать его в OnClientClick.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top