Avatar billede mosquito Nybegynder
25. marts 2006 - 19:03 Der er 6 kommentarer og
1 løsning

transfer values from clientside script to serverside

Jeg har et javascript som akkumulere data i en tekststreng. Når jeg submitter, skal den endelige streng anvendes serverside sammen med flere andre informationer.

Hvis jeg smider en alert(EditString), vises den akkumulerede tekst fint, men når jeg tilgår den via dens id, er strengen tom.

Scriptet gør en listbox editable, og for hver karakter der indtastes i det pågældende listitem, gemmes strengen i 'EditString'

'describtions.js'
    var PreviousSelectIndex = 0;     
    var SelectIndex = 0;             
    var SelectChange = 'MANUAL_CLICK';
   
    function fnChangeHandler()
    {
      var EditElement = document.getElementById('ctl03_editableList');
      var size = EditElement.length;
     
      PreviousSelectIndex = SelectIndex;     
      SelectIndex = EditElement.options.selectedIndex;
   
      if ((PreviousSelectIndex == (size - 1)) && (SelectIndex != (size - 1))&&(SelectChange != 'MANUAL_CLICK'))
      {
        EditElement[(size - 1)].selected=true;
        PreviousSelectIndex = SelectIndex;
        SelectIndex = EditElement.options.selectedIndex;
        SelectChange = 'MANUAL_CLICK';       
      }
    }
   
    function fnKeyDownHandler()
    {
        var key = window.event.keyCode;
       
        if(key == 8 || key==127)
        {
        key = '';
        return true;
        }
        key = '';
        return true;
    }
   
    function fnKeyPressHandler()
    {
    var EditElement = document.getElementById('ctl03_editableList');
      var size = EditElement.length;
      var key = window.event.keyCode;
     
      if(size != 0)
        if (EditElement.options.selectedIndex == 0)
        {
          var EditString = EditMe.innerText;   
         
          if (EditString == "?")         
          {
            EditString = "";
          }
           
          if ((key==8 || key==127))
          {
            EditString = EditString.substring(0,EditString.length-1);
            SelectChange = 'MANUAL_CLICK';     
          }

          if ((key==46) || (key>39 && key<59)||(key>62 && key<127) ||(key==32))
          {
            EditString+=String.fromCharCode(key);

            var i=0;
            var EnteredChar = String.fromCharCode(key);
            var UpperCaseEnteredChar = EnteredChar;
            var LowerCaseEnteredChar = EnteredChar;
           
            if(((key)>=97)&&((key)<=122))
              UpperCaseEnteredChar = String.fromCharCode(key - 32);
             
            if(((key)>=65)&&((key)<=90))
              LowerCaseEnteredChar = String.fromCharCode(key + 32);
             
            for (i=0;i<(size-1);i++)
            { var ReadOnlyString = EditElement[i].innerText;
              var FirstChar = ReadOnlyString.substring(0,1);
              if((FirstChar == UpperCaseEnteredChar)||(FirstChar == LowerCaseEnteredChar))
              {
                SelectChange = 'AUTO_SYSTEM'; 
                break;
              }
              else
              {
                SelectChange = 'MANUAL_CLICK'; 
              }
            }
          }
         
          EditMe.innerText = EditString;
          EditMe.value = EditString;
          return true;
        }
      return true;
    }

TestSite.aspx.cs
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;
using System.Text;

public partial class TestSite : System.Web.UI.Page
{
        protected void Page_Load(object sender , EventArgs e)
        {
                ListItem editMe;
             
                        editMe = new ListItem("?");

                        editMe.Attributes["id"] = "EditMe";
                        editMe.Attributes["runat"] = "server";
                        ctl03_editableList.Items.Add(editMe);
                        ctl03_editableList.Items.Add("Test 1");
                        ctl03_editableList.Items.Add("Test 2");
                        ctl03_editableList.Items.Add("Test 3");
                        Session["editme"] = editMe;
             
                editMe = (ListItem) Session["editme"];
        }
        protected void btn_Click(object sender , EventArgs e)
        {
                StringBuilder bob = new StringBuilder();
               
                bob.Append("\n");
                bob.Append("selected index: ");
                bob.Append(ctl03_editableList.SelectedIndex);

                bob.Append("\n");
                bob.Append("selected index[0]: ");
                bob.Append(ctl03_editableList.Items[0].Selected);

                bob.Append("\n");
                bob.Append("attributes count: ");
                bob.Append(EditMe.Attributes.Count);

                bob.Append("\n");
                bob.Append("EditMe text: ");
                bob.Append(EditMe.Attributes["EditMe"]);
               
                txt.Text = bob.ToString();
        }
}

'TestSite.aspx'
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestSite.aspx.cs" Inherits="TestSite" Trace="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head runat="server">
    <title>Untitled Page</title>

    <script language="javascript" src="describtions.js"></script>

</head>
<body>
    <form name="frmName" method="post">
        <select name="ctl03_editableList" id="ctl03_editableList" runat="server" enableviewstate="true" onkeydown="fnKeyDownHandler()" onkeyup="return false" onkeypress="fnKeyPressHandler()" onchange="fnChangeHandler()">
        </select>
    </form>
    <form id="Form1" runat="server">
        <br />
        <asp:Button ID="btn" runat="server" OnClick="btn_Click" Text="Button" />
        <br />
        <asp:TextBox ID="txt" runat="server" Height="243px" TextMode="MultiLine" Width="906px"></asp:TextBox>
    </form>
    <span id="Message" enableviewstate="false" runat="server" />
</body>
</html>

Hva hunde gør jeg galt?? Når jeg afvikler sitet, får jeg følgende udskrift uanset hvilket listitem der er valgt:

selected index: 0
selected index[0]: True
attributes count: 1
EditMe text:

Hjælp, jeg er ved at op i limningen... der er garanteret en simpel forklaring, men jeg kan ikke se den!!!
Avatar billede mosquito Nybegynder
26. marts 2006 - 19:33 #1
Det kan da ikke passe, at der ikke er nogen der kan hjælpe mig med at fange en variable fra et client script til serverside behandling...

eller er jeg ikke alene med problemet??

Små hints kan også være til hjælp, eller links. Hjælp til selvhjælp.
Avatar billede snepnet Nybegynder
28. marts 2006 - 20:03 #2
det er nok mere fordi det er en lidt omfattende slat kode du har sendt med ... lidt meget at sætte sig ind i :o) - og det er også lidt uigennemskueligt synes jeg.

det her kan iht. det du har sendt ikke kompilere:

bob.Append(EditMe.Attributes["EditMe"]);

hvad er for en EditMe du gerne vil tilgå derfra?

              ListItem editMe;
           
                        editMe = new ListItem("?");

                        editMe.Attributes["id"] = "EditMe";
                        editMe.Attributes["runat"] = "server";
                        ctl03_editableList.Items.Add(editMe);
                        ctl03_editableList.Items.Add("Test 1");
                        ctl03_editableList.Items.Add("Test 2");
                        ctl03_editableList.Items.Add("Test 3");
                        Session["editme"] = editMe;
           
                editMe = (ListItem) Session["editme"];

forstår jeg heller ikke helt... du laver et nyt listitem - gør ting og sager ved det, hvorefter du lægger variablen i session, og sætter den = din sessionvariabel... er det virkelig det du vil?

du tilgår også EditMe.innerHtml clientside, men jeg kan heller ikke der finde ud af hvad det er.

men ... hvis du har eksempelvis en tekstboks på en form - og propper noget i den clientside - er der ikke noget ballade i at få fat i det serverside:

// en form
<%@ 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 runat="server">
    <title>Untitled Page</title>
    <script language="javascript" type="text/javascript">
    function insertData()
    {
      var textbox = document.getElementById('<%=txtEdit.ClientID %>');
      textbox.value += 'A';
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="btn" type="button" value="button" onclick="insertData();" />
        <asp:TextBox ID="txtEdit" runat="server"></asp:TextBox>
        <asp:Button ID="btnPostBack" runat="server" Text="Button" OnClick="btnPostBack_Click" />
    </div>
    </form>
</body>
</html>

// og noget kode:
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
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnPostBack_Click(object sender, EventArgs e)
    {
        Response.Write(txtEdit.Text);
    }
}

mvh
Avatar billede mosquito Nybegynder
29. marts 2006 - 08:34 #3
Du har sikkert ret, når du siger at det måske er i overkanten med kode mængden. Det vil jeg tage til efterretning fremover.

Sciptet er en clientside editerbar dropdownlist, hvor det editerbare element er EditMe
scriptets funktion kan ses her.

http://webdeveloper.earthweb.com/repository/javascripts/2003/05/158571/Editable_Dropdowns_JScript_Subrata_Chakrabarty.html

Grunden til at jeg tilføjer EditMe on page_load, skyldes formodningen om at det var 'samme' object som clienten arbejde på. Grunden til at jeg lægger den i en session variable, skyldes at jeg ved postback vil holde værdien for EditMe, da jeg tænkte at enableviewstate måske ikke håndterede det.

Jeg kan godt høre det, nu jeg skriver det, at det ikke gør nogen forskel.

Jeg gør opmærksom på at det er testkode og btn_Click metoden kun skal liste værdier for at hjælpe mig i min testfase.

Jeg vil forsøge at beskrive det jeg søger.

Scenarie:
'?' (EditMe) elementet i dropdownlisten er valgt og jeg skriver 'TEST'

i scriptet skaber jeg en streng 'EditString' for hvert tegn taster, men kun når 'EditMe' er selected. Herefter vil jeg submit den akkumulerede streng ('TEST') fra scriptet, skal sendes til serveren.

Nu er mit spørgsmål. Er det nødvendigt at oprette en control på formen, for at tilgå
indholdet af EditString fra scriptet?
Avatar billede snepnet Nybegynder
02. april 2006 - 12:35 #4
det er i hvert fald en utrolig nem måde at fikse det på - så har du jo bare en "placeholder" for din værdi, som du kan tilgå serverside som clientside.
du kan jo bare oprette et skjult felt med runat="server" ell.... det kan du jo opfatte som din variabel.
mvh
Avatar billede mosquito Nybegynder
06. april 2006 - 14:41 #5
tak for hjælpen. Så kører det :-)

snepnet --> smid et svar og point er på vej.
Avatar billede snepnet Nybegynder
08. april 2006 - 01:44 #6
kommer her :o)
mvh
Avatar billede mosquito Nybegynder
06. maj 2006 - 18:14 #7
undskylder den forsinkede accept. Jeg kan se at du har været gevaldig behjælpsom. Næsten alle mine åbne spørgsmål er point til dig. Velfortjent og endnu en gang tak.
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