Avatar billede dj_uncas Nybegynder
27. marts 2006 - 12:31 Der er 19 kommentarer og
1 løsning

ClientScript confirm

Hejsa

Jeg har en form hvor brugere kan indtaste noget data, hvilket der skal noget serverside validering på. I et tilfælde skal brugerne promptes med en JavaScript confirm boks, inden deres data bliver gemt, men problemet er at denne boks skal komme afhængig af valideringen på serveren..

Er der nogen der har ideer til en løsning af dette scenarie?
Avatar billede dr_chaos Nybegynder
27. marts 2006 - 12:39 #1
prøv med noget i denne stil:
  protected void btn_load(object sender, EventArgs e)
    {
        //script som forhindre at bruger trykker mere end en gang
        Button btn = (Button)sender;
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("return confirm('Er du sikker på at du ønsker at gemme data?');");
        sb.Append("this.value = 'Vent venligst...';");
        sb.Append("this.disabled = true;");
        sb.Append(ClientScript.GetPostBackEventReference(btn, ""));
        sb.Append(";");
        btn.Attributes.Add("onclick", sb.ToString());
    }

du laver et OnLoad event på din knap.
Avatar billede dj_uncas Nybegynder
27. marts 2006 - 13:11 #2
mit problem er at der skal valideres på hvad brugeren har indtastet, og at det først skal ske efter han/hun har klikket på knappen. Så er en load event jo ikke så meget værd :-(
Avatar billede dr_chaos Nybegynder
27. marts 2006 - 13:15 #3
den load event placerer et javascript på onclick eventet på knappen.
Den tilader kun postback hvis siden er valid og hvis brugeren trykker ok.
ydermere tillader den kun et click.
Det er i linien
btn.Attributes.Add("onclick", sb.ToString());
at den tilføjer javascriptet til onclick event.
Avatar billede dj_uncas Nybegynder
27. marts 2006 - 13:29 #4
Det har du selvfølgelig ret i, men det der udvider mit problem i forhold til din løsning er at der i et tilfælde skal vises en alert, og et andet en confirm. Og at teksten der skal stå i confirm kun kendes i Click eventhandleren...
Avatar billede dr_chaos Nybegynder
27. marts 2006 - 13:39 #5
Kan du ikke ligge din text i en variabel så kan du hente den i onload
og måske også i hvilke tilfælde den skal bruge det ene eller det andet.
Avatar billede dj_uncas Nybegynder
27. marts 2006 - 15:19 #6
Det kan jeg desværre ikke..

Det der skal ske, er at jeg skal fange en Exception, og hvis den Exception har en type skal der vises en alert boks, med indholdet af Exception.Message, og hvis det er en anden type skal der vises en confirm, med en anden tekst.

For at forklare det lidt nærmere skal knappens eventhandler kode nærmest stoppe indtil man har klikket "ok" hvorefter resten skal udføres.

Kan man evt. invoke en metode fra clientscript?
Avatar billede dr_chaos Nybegynder
27. marts 2006 - 15:22 #7
Måske .
Jeg kan lige prøve at lave et eksempel senere når min datter sover.
Avatar billede snepnet Nybegynder
27. marts 2006 - 18:40 #8
bruger 1.1 eller 2.0?
mvh
Avatar billede snepnet Nybegynder
27. marts 2006 - 18:49 #9
(bruger du...)
Avatar billede dj_uncas Nybegynder
27. marts 2006 - 22:21 #10
det er .NET 2.0
Avatar billede snepnet Nybegynder
27. marts 2006 - 23:20 #11
du får et simpelt eksempel her så :

// din form:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CallbackIllustration.aspx.cs" Inherits="CallbackIllustration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<script language="javascript" type="text/javascript">
    function isValid(textBox)
    {
        <%= CallbackFunction %>
    }   
   
    function showResult(result)
    {
        if(result != "")
        {
            alert(result);
        }
  }   
</script>   
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtInput" runat="server"></asp:TextBox>
    </div>
    </form>
</body>
</html>


// og din kode:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CallbackIllustration : System.Web.UI.Page, ICallbackEventHandler
{
    private string _callbackFunction;
    public string CallbackFunction
    {
        get { return _callbackFunction; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Browser.SupportsXmlHttp)
        {
            txtInput.Attributes.Add("onblur", "isValid(this);");
            _callbackFunction = ClientScript.GetCallbackEventReference(this, "textBox.value", "showResult", null);
        }
    }

    string callBackResult = String.Empty;
    public string GetCallbackResult()
    {
        return callBackResult;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        if (eventArgument.Length < 3)
        {
            callBackResult = "Den går ikke du !!!";
        }
    }
}

prøv at kør det - og se om det ikke var noget i den stil du var ude efter.

mvh
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 11:00 #12
Jo, det er lidt i den retning. Men for at holde os til dit eksempel, så lad os sige at jeg gerne vil have følgende i RaiseCallbackEvent

else if( eventArgument > 3 )
{
    // Her skal bruges en confirm
}

Det er selvfølgelig meningen (som det jo altid er med confirm) at hvis man klikker ok skal man videre, og ellers skal det hele stoppe..

Jeg kan ikke lige se hvordan jeg skal få puttet den ind?
Avatar billede snepnet Nybegynder
28. marts 2006 - 17:31 #13
du kan ikke fra din serverkode vise en confirm-dialogboks, men du får da lige en udvidelse :o)

// aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CallbackIllustration.aspx.cs" Inherits="CallbackIllustration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<script language="javascript" type="text/javascript">
    function isValid(textBox)
    {
        <%= CallbackFunction %>
    }   
   
    function showResult(result)
    {
        if(result != "")
        {
            if(confirm(result) == true)
            {
                <%= PostBackFunction %>
            }           
        }
  }   
</script>   
<body>
    <form id="form1" runat="server">
    <div>
        &nbsp;<asp:TextBox ID="txtInput" runat="server" OnTextChanged="txtInput_TextChanged"></asp:TextBox>       
    </form>
</body>
</html>

// kode
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CallbackIllustration : System.Web.UI.Page, ICallbackEventHandler
{
    string callBackResult = String.Empty;

    private string _callbackFunction;
    public string CallbackFunction
    {
        get { return _callbackFunction; }
    }

    private string _postBackFunction;
    public string PostBackFunction
    {
        get { return _postBackFunction; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Browser.SupportsXmlHttp)
        {
            txtInput.Attributes.Add("onblur", "isValid(this);");
            _callbackFunction = ClientScript.GetCallbackEventReference(this, "textBox.value", "showResult", null);
        }
        _postBackFunction = Page.ClientScript.GetPostBackEventReference(txtInput, null);
    }

    public string GetCallbackResult()
    {
        return callBackResult;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        if (eventArgument.Length < 3)
        {
            callBackResult = "Er du sikker";
        }
    }

    protected void txtInput_TextChanged(object sender, EventArgs e)
    {
        Response.Write("Så er der trykket ok i boksen");
    }
}

mvh
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 21:40 #14
Ja, det er fint nok, men det løser stadig ikke mit problem.

Helt konkret skal jeg, hvis man har indtastet en tal der er større end eks. 20 vise en alert boks, der siger at det må man ikke, mens hvis man taster noget mellem 10 og 15 vise en confirm boks, for at tjekke at det er meningen med så lille et tal.

Jeg har siddet og møflet rundt med de to eksempler, men jeg synes ikke rigtig jeg kan finde frem til noget...
Avatar billede snepnet Nybegynder
28. marts 2006 - 22:00 #15
well... umiddelbart lyder det jo ikke rigtig som om der er behov for at checke den slags på serveren for at vise dialogbokse - det må siges at være en temmelig enkel validering, men ellers:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<script language="javascript" type="text/javascript">
    function isValid(textBox)
    {
        <%= CallbackFunction %>
    }   
   
    function showResult(result)
    {
        if(result == 'NOT_INT')
        {
            alert('ikke en talværdi');
        }
        if(result == "TOO_LARGE")
        {
            alert('for meget...');
        }
        else if(result == "TOO_SMALL")
        {
            if(confirm('for lidt... er du sikker på at den er god nok') == true)
            {
                <%= PostBackFunction %>
            }           
        }           
  }   
</script>   
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="txtInput" runat="server" OnTextChanged="txtInput_TextChanged"></asp:TextBox>       
    </form>
</body>
</html>

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
{
    string callBackResult = String.Empty;

    private string _callbackFunction;
    public string CallbackFunction
    {
        get { return _callbackFunction; }
    }

    private string _postBackFunction;
    public string PostBackFunction
    {
        get { return _postBackFunction; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Browser.SupportsXmlHttp)
        {
            txtInput.Attributes.Add("onblur", "isValid(this);");
            _callbackFunction = ClientScript.GetCallbackEventReference(this, "textBox.value", "showResult", null);
        }
        _postBackFunction = Page.ClientScript.GetPostBackEventReference(txtInput, null);
    }

    public string GetCallbackResult()
    {
        return callBackResult;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        int indtastning = 0;
        try
        {
            indtastning = int.Parse(eventArgument);
            if (indtastning > 20)
                callBackResult = "TOO_LARGE";
            else if(indtastning >= 10 && indtastning <= 15)
                callBackResult ="TOO_SMALL";
            else
                callBackResult = "OK";
        }
        catch (Exception)
        {
            callBackResult = "NOT_INT";
        }
    }

    protected void txtInput_TextChanged(object sender, EventArgs e)
    {
        Response.Write("så er der accepteret trods advarsler...");
    }
}

hvorfor er et tal mellem 10 og 15 for lille, mens under 10 er ok?

mvh
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 22:12 #16
Det var et dårligt eksempel.. Der skal regnes noget gennemsnit af nogle tal ud, og tjekkes på forskellige parametre, det var bare for at illustrere... Desuden er det kunden der bestemmer ;-) Det er ikke alt i det her projekt der er helt forståeligt..

Jeg kigger på dit eksempel i morgen, jeg har ikke lige mere tid nu, desværre..
Avatar billede snepnet Nybegynder
28. marts 2006 - 22:29 #17
ok - jeg tror du har hvad du skal bruge i eksemplet... ellers forstår jeg ikke hvad du mener :o)
mvh
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 14:23 #18
Ja, det virker jo, men desværre er min konklusion at mit projekt nok er lidt for komplekst til sådan noget.. Nu bruger jeg nok bare en masse metoder/eventhandlere til en masse knapper osv.. :-(

Men smid et svar snepnet - du var vist tættest på at kunne hjælpe..
Avatar billede snepnet Nybegynder
29. marts 2006 - 15:33 #19
jeg er bange for at jeg ikke helt forstår hvad du mener.... hvad er det du synes du ikke kan ved ovenstående model?
mvh
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 15:38 #20
Bum bum. Det er en længere forklaring.

Jeg har noget logik i min forretningslogik der tager sig af validering af data'ene, og kaster en Exception hvis det ikke er godt.

Problemet er så at jeg skal tage en besked fra en Exception, afhængig af en fejlkode der også bliver sendt op, og vise enten en alert, en confirm, eller ingenting...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester