Avatar billede Greenland Nybegynder
19. marts 2010 - 16:55 Der er 8 kommentarer og
1 løsning

Page methods - ajax hvordan returnere et object

Hej,

Jeg har behov for at returnere et object til min clientside.
Jeg har i min codebehind følgende funktion:

  [WebMethod]
    public static object callMe(string v)
    {
        TextBox txt = new TextBox();
        txt.ID = "myTxtBox";
        txt.Text = v + "et eller andet";
        return txt;
    }

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            txtId1.Attributes.Add("onkeypress", "java script:CallMe('" + txtId1.ClientID + "', '" + txtContact1.ClientID + "')");
            txtId2.Attributes.Add("onkeypress", "java script:CallMe('" + txtId2.ClientID + "', '" + txtContact2.ClientID + "')");
        }
    }


På min client side har jeg følgende:
function CallFailed(res, destCtrl)
{
}

function CallSuccess(res, destCtrl)
{   
alert(res);//viser at dette er et object
nu er min res et text object som jeg så vil indsætte på min page ca. således:
document.insertBefore(res,null);
.. men jeg får følgende fejl: htmlfile:No such interface supported

Hvis jeg skriver alert(res.id) får jeg undefined
}

og jeg kalder det hele fra keypress på textfelterne:

PageMethods.callMe(ctrl.value, CallSuccess, CallFailed, dest);


Håber dette er forståeligt...


Fidusen er at jeg via javascript på min client side kan hente data fra min server uden et postback, og indsætte resultatet på min webside. fx ønsker jeg at indsætte en combobox indeholdende data fra min database på serveren


:greenland:
Avatar billede Syska Mester
19. marts 2010 - 18:50 #1
TextBox er en .NET class ... den kender JavaScript ik'.

Du kan måske render den ... og returnere dens tilsvarende string ... og indsætte den på din side ...

Her er kode til at render en Control ...
public static string RenderControl(Control c)
        {
            if (c == null)
                return null;

            string output;
            using (var sw = new StringWriter())
            {
                var htw = new HtmlTextWriter(sw);
                c.RenderControl(htw);
                output = sw.ToString();
            }

            return output;
        }

Så bliver din .NET class til en string ... ala:
<input type="text" id="something" name="somename" value="somevalue" />

Den kan du så tage fat i med JavaScript og insert.

ASP.NET og JavaScript kan ikke native snakke sammen ...
Avatar billede Greenland Nybegynder
20. marts 2010 - 00:08 #2
Ja selvfølgelig.. jeg tænkte bare at .net rendrede den som normalt, men det gør den nok ikke når det gøres med page methods


Din løsning ser ud til at virke, så det er fint, men hvis jeg skal returnere en dropdownbox så er den tom ! Har du noget forslag til det ?

DropDownList dd = new DropDownList();
dd.ID = "ddDrop";
ListItem l = new ListItem("text", "value", true);
dd.Items.Add(l);

return RenderControl(dd);

Hvis jeg returnerer en TextBox så vises den ok på client siden også med tekst og det hele....

:greenland:
Avatar billede Syska Mester
20. marts 2010 - 00:31 #3
pas ... der må gå noget mere galt ...

Table table = new Talbe();
TableRow row = new TableRow();
TableCell cell = new TableCell();

table.Rows.Add(row);
row.Cells.Add(cell);

Prøv at render det ... og send tilbage ... det burde virke ... hvis det også fejler ... altså at der ik' kommer
<table><tr><td></td></tr></table>

Tilbage ... så er det et eller andet helt galt.

og et svar.
Avatar billede Greenland Nybegynder
20. marts 2010 - 01:18 #4
nix, ingen table returneres....

Jeg ved ikke hvor "galt" det kan være da det virker med en TextBox !!?

Jeg sætter mit objekt ind på siden på denne måde:

function CallSuccess(res, destCtrl)
{   
  var element = document.createElement(res);
  document.body.insertBefore(element);
}



Hvis jeg gør det direkte på denne måde:

  document.body.insertBefore(res);

så får jeg følgende fejl: "htmlfile: Typeuoverensstemmelse"
Avatar billede Syska Mester
20. marts 2010 - 01:25 #5
Ja ... men har du set om den funktion reelt set returnere noget ?
( og ingen gæt værk her )

Sæt et break point, og se hvad den string indeholder ...

mvh
Avatar billede Greenland Nybegynder
20. marts 2010 - 12:52 #6
Ingen gæt værk nej, og ja den returnerer noget.

Hvis jeg på client siden skriver:
  alert(typeof(res)); så får jeg typen: String
og jeg indsætter den således:
    var element = document.createElement(res);
    document.body.insertBefore(element);
... men der bliver ikke indsat nogen tabel

Hvis jeg returnerer en TextBox, så indsættes der en tekstbox med samme kode som ovenstående... "mig ikke forstå"
}
Avatar billede Syska Mester
20. marts 2010 - 15:16 #7
tror ik' du kan kalde create element på noget som har neasted elements ...

Men ... hent FireBug ... uber fedt tool med masser af plugins:
http://getfirebug.com/

Der findes også tools til IE, kan bare ikke huske hvad det hedder.

Ups, Firebug findes også til IE: http://getfirebug.com/firebuglite

Så kan du se hvad dine services returnere ...
Avatar billede Greenland Nybegynder
25. marts 2010 - 09:45 #8
Ok, tak skal du have

Jeg ser nærmere på dette intressante værktøj....

smid et svar...


:greenland:
Avatar billede Syska Mester
25. marts 2010 - 10:15 #9
svar
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