Avatar billede kryderbolle Nybegynder
29. marts 2010 - 11:36 Der er 17 kommentarer og
1 løsning

Genbrug layout

Genbrug layout
Hej alle.

Jeg er ret ny i asp.net (C#), og har brug for hjælp til at oprette genbruglige layouts. Min side skal vise en masse data, og det skal selvfølgelig formateres ens, og det skal selvfølgelig være let at rette det.

I oldschool ASP havde jeg bare en dataStart og dataSlut funktion som udskrev hvad jeg nu havde bestemt. Det kunne f.eks være:

function dataStart(overSkrift)
  response.write "<table><tr><td>"& overSkrift &"</td></tr><tr><td>"
end function

function dataStart(overSkrift)
  response.write "</td></tr></table>"
end function

Dem brugte jeg så sådan:
<% call dataStart("Søg data") %>
.. Form blok med søge felter ..
<% call dataSlut() %>
<br>
<% while not rs.eof %>
<% call dataStart("Vis data") %>
..Her vises hvert resultat i hver deres blok ..
<% call dataSlut() %>
<%  rs.MOveNext
  wend %>


Jeg har brug for at lave det samme i .NET, men hvordan? Er det en user control eller er vi over noget masterpage, eller noget helt andet?
Avatar billede keysersoze Guru
29. marts 2010 - 11:47 #1
En masterpage er til det overordnede design - altså fx topbanner og menu - så det lyder ikke til at være det rigtig valg hvorimod en usercontrol umiddelbart ville være et rigtige og det er også en simpel løsning da du bare pusher data ind i den og så sørger den for hele udseendet. En sidste mulighed kunne være udvikling af din egen custom control.
Avatar billede kryderbolle Nybegynder
29. marts 2010 - 13:05 #2
Nu har jeg kigget på usercontrols, men jeg har ikke kunne finde en ordentlig tut. De viser bare hvordan man kan lave en genbruglig blok af data, men man kan ikke dynamisk bestemme hvad der skal være i den.

Jeg er dog også falder over order "Page Templates", men har ikke helt kunne finde ud af hvad det er...

Så jeg har brug for lidt mere hjælp til at komme igang.

Jeg fik faktisk lige en ide, og gå ud fra det er en usercontrol der skal laves. Men er det muligt at lave noget så man kan skrive:

<asp:MyDataBlock title="enHeaderJegBestemmer">
Her bestemmer jeg data
</asp:MyDataBlock>

MyDataBlock's funktion er udelukkende at skrive HTML kode.

Ved ikke om jeg er inde på det rigtige...
Avatar billede kryderbolle Nybegynder
29. marts 2010 - 15:44 #3
Fandt ud af det via dette link:
http://www.eggheadcafe.com/tutorials/aspnet/92a47792-a768-4379-8997-2b1f513d86bc/aspnet-templated-usercon.aspx

Man skal bruge template på en user control.
Avatar billede keysersoze Guru
29. marts 2010 - 16:22 #4
tak for hjælpen...

Jeg kan ud fra det du har beskrevet ikke helt se gevinsten ved en templated usercontrol i dit tilfælde - men du må jo have styr på hvad du laver når du lukker og beholder point selv så hurtigt...
Avatar billede kryderbolle Nybegynder
30. marts 2010 - 10:57 #5
Hej Keysersoze.

Som jeg skrev er jeg meget ny i asp.net, og ved ærlig talt ikke helt hvad jeg gør. Igår morges vidste jeg ikke engang hvad en user control var (og ved det nok stadig ikke helt).

Jeg troede faktisk template var den gyldende lysning, men det har måske vist sig at være forkert, da jeg nu ikke kan tilgå elementerne (har oprettet et nyt spørgsmål hertil http://www.eksperten.dk/spm/905805).

Jeg opretter gerne et nyt spørgsmål, hvis du kan hjælpe mig med at lave en usercontrol (eller noget helt andet). Bare jeg har layout blok, hvor jeg kan smide hvad som helst i.

Jeg har søgt og søgt, og kan ikke forstå at der ikke findes en indbygget funktion til det. Jeg kan da for pokker ikke være den første, der har brug for at lave et standard layout. Men mit ptoblem er at når jeg ikke ved hvad det hedder, er det svært at søge på (og derfor også at finde).
Avatar billede keysersoze Guru
30. marts 2010 - 11:12 #6
hvis du søger en mulighed for at lave et standardiseret layout hvad vil du så opnå med at smide en blok kode ind i?

en Usercontrol opfylder det behov du, som jeg ser det, beskriver i dit spørgsmål ikke alene ved at det er den der tegner hvad du har i datastart og dataslut men også den der udskriver data (push data ind vha en property).
Avatar billede kryderbolle Nybegynder
30. marts 2010 - 11:54 #7
Så er mit spørgsmål bare hvordan pusher man data ind i en user control via en property? Kan du evt. give mig et link hvor jeg kan læse om det?

For at illustrere hvad det egentlig er jeg vil, så prøv at klikke på "min profil" i din profil boks øverst til højre. Så skulle du gerne komme ind på din profil side hvor du kan se flere "bokse" med info ala "Info", "Kontakt oplysninger", "Online" osv.

Som du kan se er hver "data boks" omkranset af en streg og der er en trekant før overskriften. Hvis du tjekker kildekoden vil du se hver boks består af dette:

<div class="group">
  <h3>Info</h3>
  <div class="groupInner">
    <dl class="profile_list">
      <dt>Oprettet</dt><dd>17. januar 2008 kl. 09.01</dd>
      <dt>Sidst på</dt><dd>29. marts 2010 kl. 12.20</dd>
      <dt>Indlæg</dt><dd>9</dd>
    </dl>
  </div>
  <div class="groupBottom"></div>
</div>

Hvor den eneste forskeld er det der står i <h3> og <div class="groupInner"> tagene. Den smarte programmør skrive selvfølgelig ikke dette layout hver gang det skal bruges. Men smider det i en funktion af en slags, så skal det rettes på et senere tidspunkt, gør man det kun et sted.

Så for at bruge Expertens layout som eks. Hvordan ville du så lave en funktion/usercontrol til at udskrive denne boks igen og igen. Den skal selvfølgelig modtage en overskrift som smides i <h3> taget og data som smides i <div class="groupInner"> taget.
Avatar billede keysersoze Guru
30. marts 2010 - 12:26 #8
Avatar billede kryderbolle Nybegynder
30. marts 2010 - 13:58 #9
Så langt så godt. Jeg har rette koden fra dit link, så der nu kun er en Panel control og jeg kan indsætte en kontrol i den. Det går jeg ud fra også kunne være en panel control med flere controles tilknyttet.

Dette er UC'en:
<%@ Control Language="C#" ClassName="Spinner" %>
<script runat="server">
    private Control m_control = new Control();
    public Control data
    {
        get { return m_control; }
        set { m_control = value; }
    }
    protected void Page_Load(Object sender, EventArgs e)
    {
        Panel1.Controls.Add(m_control);
    }
</script>
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>   


Og i min code behind gør jeg sådan:
        TextBox t = new TextBox();
        t.ID = "TextName";
        t.Text = "Indtast dit navn";
        Spinner1.data = t;

Det virker fint. Men... Så skal alt indhold bygges i codebehind, hvilket gør jeg ikke kan bruge Source/Design vinduet til at trække controlls (så som SqlDataSources, GridViews osv.) direkte ind på siden. Den funktionalitet har jeg med Templates. Hvor koden simpelt bare er:

<uc2:placeholder ID="placeholder1" runat="server">
<TitleTemplate>Overskrift</TitleTemplate>
<DataTemplate>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
        </Columns>
    </asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ ConnectionStrings:connection %>"
    SelectCommand="SELECT [name] FROM [GREEN_InstitutionType]">
</asp:SqlDataSource>
    </DataTemplate>
</uc2:placeholder>

Men med Templates er mit problem så, at jeg ikke ved hvordan jeg kan tilgå elementerne i codebehind, hvis jeg nu gerne ville sætte TextBox1.Text = "Skriv noget her";. Hvilket er hvad mit andet spørgsmål, som jeg linkede til tidligere går på.

Jeg skal ikke kunne sige hvad der er smartest/bedst, da jeg slet ikke er nok inde i .NET, men jeg kan pt. bedst lide template metoden (hvis jeg da får løst mit tilgå element problem).
Avatar billede keysersoze Guru
30. marts 2010 - 14:39 #10
du kan tilføje kontroller til en usercontrol på præcis samme måde som på en page/masterpage - du behøver altså ikke tilføje kontroller runtime som i eksemplet.
Avatar billede kryderbolle Nybegynder
30. marts 2010 - 14:42 #11
Ok... Det lyder intressant. Hvordan gør man så det?
Avatar billede keysersoze Guru
30. marts 2010 - 19:12 #12
Som nævnt, på præcis samme måde som en page/masterpage; åbn din .ascx-fil og og vælg om du vil programmere i design, split eller source mode.
Avatar billede kryderbolle Nybegynder
31. marts 2010 - 09:13 #13
Jeg kan simpelthen ikke se hvad du mener...

Ja jeg kan editere usercontrolen og smide f.eks. en tekstbox ind, men så får ALLE udgaver af den usercontrol en tekstbox. Og det er ikke det jeg vil. For den usercontrol skal være måske 10 gange på en side. En gang i toppen med en top menu, i venstre side med menu, i midten med en søge formular, og under med søge resultaterne, i bunden med firmainfo (adresse, tlf osv.).

Ved at smide data ind via parametre eller templates, som vi har gennemgået tidligere, kan jeg løse problemet. Det er bare en besværlig måde at gøre det på fordi:

1. Med parametre løsningen, kan vores grafikere ikke lave siden, da alt skal kodes i codebehind (og de kan de ikke kode).
2. Med template løsningen kan grafikererne godt lave siden, men så kan vi (programmøerne) ikke tilgå elementerne i codebehind når der skal laves noget specielt.
Avatar billede kryderbolle Nybegynder
31. marts 2010 - 09:41 #14
Jeg ahr fundet ud af hvordan jeg tilgår template elementerne i codebehind, så det er den metode jeg bruger.

Jeg har lavet et spørgsmål med point til dig her for din hjælp:
http://www.eksperten.dk/spm/905899
Avatar billede keysersoze Guru
31. marts 2010 - 09:50 #15
så bliver du nødt til at svare mig på det jeg tidligere har spurgt om - du søger en måde at lave genbrugeligt layout på, men når det kommer til stykket er der åbenbart ikke noget genbrugeligt i det alligevel?

Ang dit template-problem, så prøv at kig på kommentarerne fra John Pequeno på http://weblogs.asp.net/scottgu/archive/2006/06/04/Supporting-Templates-with-ASP.NET-User-Controls.aspx
Avatar billede keysersoze Guru
31. marts 2010 - 09:56 #16
lidt langsom har man lov til at være (:
Avatar billede kryderbolle Nybegynder
31. marts 2010 - 11:43 #17
Det er da 100% genbruglig.

Jeg har nu EN (og kun en) layout control som har en titel og data template. Denne control bruger jeg nu til ALLE mine blokke (top menu, venstre menu, søge, resultater... alt)

Sådan:
<uc2:layoutBlock ID="menuBlock" runat="server">
<TitleTemplate>Menu</TitleTemplate>
<DataTemplate>
    <asp:Menu ID="Menu1" runat="server">
    </asp:Menu>
</DataTemplate>
</uc2:layoutBlock>

<uc2:layoutBlock ID="searchBlock" runat="server">
<TitleTemplate>Søg</TitleTemplate>
<DataTemplate>
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Søg" />
</DataTemplate>
</uc2:layoutBlock>

Hvis ikke det er 100% genbrug, så ved jeg ikke hvad det er :)

Eneste problem er bare at man ikke kan se resultatet i design view. Så vores grafiker må bygge dataerne op først (for at kunne se det), også slutte med at smide layoutBlokken omkring. Men det er en mindre detalje.

Som noget helt andet, kan jeg ikke forstå der ikke er indbygget en layout funktion i .NET. Alle sites har en eller flere layout blokke, som bruges igen og igen. Selv her på E har de kun 2. Den med mørkegrå overskrift (der bruges til indlæg, nyhedsoversigt osv), samt den med streg omkring (man f.eks. ser under sin profil). Disse blokke burde man sku da kunne oprette et sted, også bare trække ind på siden hvor de skal være, også smider man indhold i dem.

Det er det jeg næsten kan med templates. Mangler at kunne blive vist i design view. Men det kan jeg ikke lave endnu (hvis det da over hoved kan laves).

Måske det kan klares med Render, for det lader til at det er helt vildt hvad den kan, men det er langt over mine nuværende evner:
http://weblogs.asp.net/infinitiesloop/archive/2007/09/19/rendering-asp-net-controls-out-of-place.aspx
Avatar billede keysersoze Guru
31. marts 2010 - 23:10 #18
Der hvor vi går skævt af hinanden, tror jeg, er hvad du ser som genbrug i forhold til hvad jeg ser og det skyldes formentlig at jeg ikke er nok inde i din/jeres form for opsætning.

Når jeg tænker på genbrug tænker jeg på "kontroller" - det kunne fx være "seneste blogindlæg" eller "nyheder fra computerworld" i bunden af siden og her ville jeg nok lave en usercontrol, som tog imod en en overskrift samt en form for liste af data og så behandlede den efter behov - mens det du (måske) leder efter er genbrug af designblokke og her mener jeg det kan løses med alt mellem CSS, over til design-hjælpeklasser (lidt som klassisk ASP) og til usercontrols alt afhængig af hvor stort et område vi taler om.

Jeg må desværre sige at jeg ikke umiddelbart kan komme nærmere et bud på noget bedre.
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