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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top