Como alterar programaticamente o evento OnClientClick e chamá -lo?
-
18-09-2019 - |
Pergunta
Eu tenho uma ListView que contém listas de reprodução. Se o usuário quiser editar um álbum, clique no link Editar e permite que eles removam ou adicionem músicas à lista de reprodução. Se o usuário quiser salvar uma nova lista de reprodução, mantendo a original, clicaria em um botão Salvar como. Aqui está o que deve acontecer:
Se o usuário clicar em Salvar como e eles não mudaram o nome, eu quero exibir um alerta dizendo a eles que eles devem alterar o nome.
Se o usuário clicar no Salvar como e eles mudaram o nome, quero exibir uma confirmação de que eles realmente desejam salvá -lo.
Atualmente, o que está acontecendo é que, se eu colocar algo como o seguinte no meu código, o script não se registrará até o segundo clique e qualquer script foi registrado, o que significa que, se eu acabar alterando o nome e o script alerta foi registrado Antes, ele exibirá o alerta em vez da confirmação. Aqui está o código:
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 + "?');";
}
Eu também tentei adicionar o retorno falso para que ele não faria um postback, mas se eu fizer isso, ele não faz nada quando clico em OK na confirmação.
Solução
O que Slaks disse que está correto, você está entendendo mal o ciclo de vida da página. O código JavaScript precisa estar em vigor na página antes da Você clica em Salvar como. No seu exemplo, conforme descrito, o usuário faz alterações no título/nome e cliques Salvar como, após o qual o código JavaScript é aplicado ao botão. Na segunda vez que eles clicam em Salvar como, os resultados da validação do exemplo anterior aparecem.
Opção 1: Use um controle de validador
A maneira mais simples de resolver isso é usar um controle de regulamento do Validador para comparar os valores.
Snippet Markup:
<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" />
Em seu código-behind, uma vez que os campos do formulário (nome do álbum, etc.) estiverem vinculados, execute o seguinte:
valName.ValidationExpression = string.Format("[^{0}]", Regex.Escape(lblName.Text));
A expressão regular acima será válida para qualquer entrada, exceto o que havia para começar. Se o usuário alterar o texto para o nome do álbum, o botão Salvar será validar corretamente. Caso contrário, o validador entrará em ação e exibirá uma mensagem na página dizendo que eles precisam alterá -la.
Em seguida, manuseie o OnClick
Evento do botão Salvar apenas para salvar os valores, porque ele apenas disparará se a página foi validada:
protected void btnSaveAs_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
//do you save actions as needed
}
}
Você também pode usar sua caixa de confirmação como desejando, fazendo:
protected void Page_Load(object sender, EventArgs e)
{
btnSave.OnClientClick = "return confirm('Are you sure you wish to change the name?');";
}
O acima deve funcionar muito bem. Uma abordagem alternativa está listada abaixo:
Opção 2: Use uma função de validação ao lado dos clientes
Se você quisesse fazer a validação completamente do lado do cliente, pode, mas será muito mais complicado. O que você precisa fazer é registrar uma função de validação completamente do cliente.
Em seu código atrás de Page_prendergere:
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);
}
Espero que isto ajude. Provavelmente, existem alguns erros de sintaxe no exposto, pois eu apenas os joguei juntos rapidamente ..
Outras dicas
o OnClientClick
A propriedade é uma string javascript, não um URI. Portanto, você não deve começar com isso javascript:
.
Para lidar com o confirm
Corretamente, escreva OnClientClick = "return confirm('Are you sure?');";
Além disso, você está entendendo mal o modelo de página do ASP.NET.
Seu manipulador de eventos C# Code-Behind apenas é executado depois o usuário clica no botão e depois a OnClientClick
ligue de volta. Você precisa escrever tudo isso em JavaScript e chamá -lo OnClientClick
.