Avatar billede websam Nybegynder
17. april 2006 - 00:58 Der er 12 kommentarer og
1 løsning

Et spørgsmål til form uden runat="server"

Hejsa,

Hvis nu jeg vil lave en html formular uden runat="server" i form tag'en, men stadigt vil kunne benytte code-behind hvordan skal jeg så gribe det an.

Html :

<html>
<body>

<form runat="server">
Enter your name: <input id="name" type="text" size="30" runat="server" />
<br /><br />
<input type="submit" value="Submit" OnServerClick="submit" runat="server" />
<p id="p1" runat="server" />
</form>

</body>
</html>

Code-behind :

Sub submit(sender As Object, e as EventArgs)
    if name.value<>"" then
        p1.InnerHtml="Welcome " & name.value & "!"
    end if
End Sub

Dette eksempel virker ganske fint, men når jeg fjerner runat="server" duer det ikke.

Kan nogen komme med en idé til hvordan jeg får det til at spille uden runat="server" ?

/Websam
Avatar billede snepnet Nybegynder
17. april 2006 - 01:21 #1
det kan du ikke sådan lige umiddelbart, og du kan for det meste klare dig uden - du kan dog finde implementeringer af det rundt omkring:
http://authors.aspalliance.com/PaulWilson/Articles/?id=4
og her en artikel der også kan være interessant at tage en kigger på:
http://msdn.microsoft.com/msdnmag/issues/03/05/CuttingEdge/
mvh
Avatar billede websam Nybegynder
17. april 2006 - 01:44 #2
Jeg er ikke sikker på at jeg har forklaret mig godt nok, eller ikke forstår hvad du mener, så jeg prøver lige på en gang til. Hvis jeg vil lave en html formular hvor jeg ikke benytter runat="server" kan jeg så ikke bruge codebehind ?

Og hvordan skal jeg så gribe det an ?

/Websam
Avatar billede snepnet Nybegynder
17. april 2006 - 02:40 #3
well... det korte svar må være nej, men du kan tilgå forms-elementer på normal vis:
object o = Request.Forms["someId"]; ... og sådan noget som dette her vil også funge:

<form id="form1" runat="server">
    <asp:Button ID="btn" runat="server" />
</form>
<form id="f2" action="Default2.aspx" method="post">
    <input name="someText" type="text" />
    <input type="submit" />       
</form>

med denne kode:

try
{
    // vil gå fint når du trykker på <input type="submit" />
    string tekst = Request.Form["someText"];
}
catch (Exception)
{
    Response.Write("Nothing there");
}

men altså ... så er du jo bombet tilbage til stenalderen, og det er der vil ikke meget fidus i?

du kan jo så bruge wilson-siden, eller måske usercontrols.... afhængigt af hvad det er du vil opnå (hvad er det for et problem du har?).

mvh
Avatar billede websam Nybegynder
17. april 2006 - 11:02 #4
Landet ligger jo sådan at jeg kun kan bruge nogle ganske få af de indbyggede controller når jeg ikke har runat="server" med i form tag'en. Og ja det gør livet surt for mig hvad drag'n drop programmeringen angår.

Men MS har lavet den famøse viewstate på alt hvad der overhovedet er af elementer i VS 2005 hvilket laver en større eller mindre viewstate i toppen af siden. Denne kan man så med programmering flytte til bunden af siden så diverse søgemaskiner ikke rammer i den som det første på siden.

Landet ligger så sådan at jeg skal lave et site uden denne "støj" og alt skal laves i div's med tilhørende CSS. Mit business og datalag er der ingen problemer med at lave som jeg altid har gjort, men efter som at opgevestilleren ikke ønsker noget "støj" i den færdigt genereret html kan jeg ikke benytte mig ret meget af de indbyggede controller da disse kræver runat="server" og dermed giver støj på siden.

Normalt vil jeg lavet noget i stil med :

VB
Dim Fornavn As String = Fornavn.Text
Dim Efternavn As String = Efternavn.Text
osv.....

Hvor jeg så med en alm. html form må gøre således :

Dim Fornavn As String = Request.Form("Fornavn")
Dim Efternavn As String = Request.Form("Efternavn")

At jeg så skal lave min egen "viewstate" ved hjælp af session's eller andet giver mere programmeringen i sidste ende. Jeg kan heller ikke benytte mig af gridview, treemenu, dropdown list osv.....men når opgaven er som denne må jeg forsøge at løse den bedst muligt.

Men hvis du kan komme i tanke om andre muligheder er du mere end velkommen til at komme med lidt input.

/Websam
Avatar billede snepnet Nybegynder
17. april 2006 - 11:27 #5
du kan slå viewstate fra... på applikationsniveau, sideniveau og kontrolniveau - så det burde være tilstrækkeligt.
du får altid - som du har bemærket - et lille viewstate, men kontroller hvor du angiver viewstate="false" genererer ikke noget i viewstate.
visse 2.0 kontroller kan finde på at generere et controlstate, men det er småting - og essentielt for at kontrollen virker.
mvh
Avatar billede websam Nybegynder
17. april 2006 - 11:33 #6
Og du mener dermed ikke at det skulle have nogen betydning at der stadig genereres den lille viewstate så snart runat="server" er sat på form tag'en ?

For jeg er ret sikker på at opgavestilleren vil benytte sig af en ekstern SEO konsulent efterfølgende og har jeg ikke lavet det optimalt for jeg mere arbejde (uden betaling, IKKE godt *GGG*)

/Websam
Avatar billede snepnet Nybegynder
17. april 2006 - 12:08 #7
jeg mener at du skal banke ind i hovedet på dem hvordan landet ligger, og hvis du har brug for en hånd til det, kan du bare sige til.
ikke forstået på den måde, at jeg forherliger viewstate - bestemt ikke - men det er unægteligt en meget begrænset mængde du får hvis du slår det fra hvor du kan, og det kan også lade sig gøre at gemme hovedparten af det på serveren - specielt hvis du benytter 2.0 er det uhyre enkelt:

// lave en .browser fil (og læg den i App_Browsers)
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.Page" adapterType="CustomAdapters.PageStateAdapter" />
    </controlAdapters>
  </browser>
</browsers>
mvh

// og en adapter:
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;
using System.Web.UI.Adapters;

namespace CustomAdapters
{
    public class PageStateAdapter : PageAdapter
    {
        public override PageStatePersister GetStatePersister()
        {
            return new SessionPageStatePersister(this.Page);
        }
    }
}

så gemmer den viewstate i din session istedet.

men altså.... et lille viewstate slipper du ikke for på den måde, men hvis de 20 bytes (eller hvor meget det nu er) har en betydning for kunden, bliver du nok aldrig færdig med løsningen alligevel :o)

du er velkommen til at skrive på messenger (kan ikke huske hvad du kalder dig derude :o)

mvh
Avatar billede websam Nybegynder
18. april 2006 - 17:41 #8
Der hvor jeg ser det nødvendigt med viewstate er egentligt kun på formulare hvor det ofte kan være en fordel. Og da de fleste sider med formulare ligger på et admin modul ser jeg heller ikke de store problemer med det, da disse sider ikke er af interesse for søgemaskinerne.

Ved visning af sider med træk fra database kan jeg godt undvære viewstate ved at slå den fra på side niveau og dermed "kun" få den omtalte 20 byte viewstate som i reglen ikke burde have nogen betydning for SEO

Hvis vi så kigger på en kopi fra en af mine sider :

<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKL.../>
</div>

<script type="text/javascript">
<!--
var theForm = document.forms['Form1'];
if (!theForm) {
    theForm = document.Form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
// -->
</script>

Så kunne jeg godt tænke mig en forklaring på hvad __EVENTTARGET, __EVENTARGUMENT, __LASTFOCUS og hvad det javascript kode der genereres bruges til ?

Grunden til at jeg spørger om dette er at jeg på andre sider har set at man kun har :

<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKL.../>
</div>

Hvilket jo fjerner noget "støj" fra siden hvordan gøres dette ?

/Websam
Avatar billede snepnet Nybegynder
18. april 2006 - 18:37 #9
well... javascriptkoden sætter __EVENTTARGET og __EVENTARGUMENT så du kan samle dem op på serveren, hvor du jo gerne vil kunne abbonnere på et event, og få et argument med på vejen.
derefter submitter den formen.
koden genereres hvis der er behov for det - altså hvis du har kontroller på formen der skal udføre et postback - og ikke renderes som submit's (som en knap).
__LASTFOCUS indsættes hvis du sætter en dropdownlist ind med autopostback = true (måske også i andre situationer).
mvh
Avatar billede websam Nybegynder
18. april 2006 - 19:21 #10
Ok jeg takker for din hjælp til dette. Jeg vil tage en snak med opgave stilleren om de forskellige ting og skulle disse gå helt i vasken kan det godt være jeg lige teger fat i dig igen ;o)

Med den browser fil du snakked om længere oppe er det så meningen at den gælder for alle browser typer eller skal der være en for hver ?

Og den adapter du beskriver er så en seperat klasse ikke ?

/Websam
Avatar billede snepnet Nybegynder
18. april 2006 - 19:23 #11
adapterfilen gælder for alle browsere - adapteren er blot en klasse du kan lægge i app_code.
du er velkommen til at tage fat i mig, hvis der skulle blive ballade med dem :o)
mvh
Avatar billede websam Nybegynder
09. august 2006 - 12:21 #12
Jeg fortsætter med at benytte de indbyggede form elementer da de i sidste ende godt kunne se et økønomisk aspect i det ;o)

Smid et svar.

/Websam
Avatar billede snepnet Nybegynder
09. august 2006 - 12:44 #13
Kommer her :o)
Mvh
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