webForumDet fria alternativet

.Net och kompatibilitet, accessibility, snygg kod m.m.

.NET

16 svar · 875 visningar · startad av Addeladde

Medlem sedan jan. 20013 406 inlägg
Frågan#1

Hej

Jag har tittat en del på .Net till och från men alltid dragit mig ifrån att börja utveckla i det. Traditionell asp är det som jag oftast utvecklar i.

Några av fördelarna med .Net som brukar nämnas är att man kan separera applikationen från layouten. Eller att man får en tydligare uppdelning på lagren.

Det finns dessutom lite olika sätt att utveckla i .NET C# verkar vara det vanligaste och att man kör med Code Behind. Vad är fördelarna med Code Behind mer än att man separerar? Blir webplatsen snabbare mer resurssnål?

Angående separation så brukar man även göra det med CSS och lägga det i en fil. När man använder .NET så har det en förmåga av att lägga till style attributet lite här och där. Inte speciellt snyggt enligt många.

Testar man att validera sin sida på W3C så går inte det igenom för kod som _viewstate och liknande läggs till.

Jag utvecklar i princip alla mina webbaplikationer så att de ska fungera på både PC och Mac i IE, Safari och Firefox. All denna kod som .NET ramverket lägger till kan jag inte tänka mig att det är kompatibelt till 100% på alla plattformar? Kan man påverka alla dessa javascript som skapas?

Titta bara på denna lilla kod:

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form runat="server" id="myForm">
  <asp:textbox AutoPostBack="true" EnableViewState="true" id="myTextbox" runat="server"/>
</form>
</body>
</html>

Som blir allt det här: (inte speciellt snyggt och det validerar inte heller)


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form name="myForm" method="post" action="test.aspx" id="myForm">
<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="/wEPDwULLTIwNDAwODk2OTNkZI8ammWecL/h0jCZvc6+9+I2dkKa" />
</div>

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

<script src="/WebResource.axd?d=vHzuntsZN5jO2SU5RiTwQw2&amp;t=632786627135156250" type="text/javascript"></script>

<input name="myTextbox" type="text" value="test" onchange="javascript:setTimeout('__doPostBack(\'myTextbox\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="myTextbox" />

<div>

	<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgL76P+vDQL1mZrsAbaS+xga+auM2r65aVTblck4Du5n" />
</div></form>
</body>
</html>

Det här gör mig jättesnurrig och det får mig att känna att jag inte har någon kontroll.

Hur är det sedan med ASP.NET 2.0 kan man jobba med designen precis hur man vill eller är man begränsad? Går det att förändra ett grid precis som man kan med html, stylesheets och javascript?

Antar att .net är mer resurssnålt än traditionell asp?

Vilka andra program kan man jobba med i .NET än Visual Studio? Dreamweaver vet jag men det klarar väl inte code behind? Kan man jobba med något program i OSX på mac med .NET 2.0 och code behind?

Antar att man i princip kan koda på samma sätt som i ASP med vanliga formulär, recordset osv istället för att använda objekt i .NET om de inte går att förändra som man vill. Men har man vunnit något då? Då är ju ändå inte koden separad från innehållet. Att .Net med C# är objekt orienterat är inget magiskt det går att skriva objektorienterad kod i asp också.

Med .NET verkar det också vara enklare att kunna kommunicera med olika tjänster i Windows för att t.ex. sätta upp användar konton, ställa in rättigheter på mappar m.m. Stämmer detta eller är det precis lika om man i ASP bygger egna com-objekt?

Hoppas få lite klarhet i .NET så att jag verkligen tar mig i kragen och går över.

Medlem sedan nov. 20041 189 inlägg
#2

Ta dig i kragen och gå över. Skillnaderna är enorma. När du har gått över öppnar sig en helt ny värld av effektivitet.

- Jag kodar allting i CSS och tänker mycket på tillgänglighet och standarder när jag designar. Att använda Framework 2.0 till detta är inget problem. Det bara kräver kunskap, precis som vad annat som helst.
- Det finns andra program än VS, tex web matrix. Men det är inget jag rekommenderar, av många skäl.
- Du kan inte använda recordset i .Net, men du kan använda OdbcDataReader, eller andra dataläsare, som fungerar som recordset, ungefär. Något enklare.
- "Hur är det sedan med ASP.NET 2.0 kan man jobba med designen precis hur man vill eller är man begränsad? Går det att förändra ett grid precis som man kan med html, stylesheets och javascript?" - masterpages för design, css och javascript är också möjliga. Dynamiska alternativ finns för båda dessa.

Jag gick från ASP för några år sedan och jag har inte ångrat mig för 5 öre. Kodade i ASP för inte så länge sedan, i en tabellayout. Det äckligaste och hemskaste jag gjort på länge, och det slutade med att jag gjorde vissa sidor helt i .Net, när jag tex. behövde enkel uppladdning.

Du har fler frågor, men jag är trött ;).

Medlem sedan jan. 20013 406 inlägg
#3

Det viktigaste dock som jag vill ha svar på är hur det är med kompatibiliteten på den kod som .net genererar

Medlem sedan aug. 20003 575 inlägg
#4

"Browser Compatibility

Because ASP.NET Web page processing occurs on the Web server, ASP.NET Web pages are compatible with any browser or mobile device. A Web page automatically renders the correct browser-compliant markup (XHTML or other markup language) for features such as styles and layout. Alternatively, you can create Web pages with controls that are specifically designed to render output for specific devices, such as mobile phones. For more information, see Creating ASP.NET Mobile Web Pages.

http://msdn2.microsoft.com/en-us/library/ms178125(VS.80).aspx

Om det stämmer eller ej låter jag vara osagt.

Medlem sedan jan. 20013 406 inlägg
#5

Jag tror inte att all javascript som produceras funkar i Safari. Det är Microsoft som gjort koden.

Medlem sedan nov. 20041 189 inlägg
#6

Du behöver inte låta speciellt mkt javascript bli producerat. Det är upp till dig om du använder de inbyggda kontrollerna, och därför så är det bättre att byta upp, oavsett. Jag har inte haft speciellt mkt problem med andra webbläsare, men jag använder på sin höjd postback som fungerar.

Medlem sedan jan. 20013 406 inlägg
#7

Jag har suttit och mixtrat lite under helgen med .Net och vissa saker är ju verkligen smidiga och det går framför allt snabbt. Sen gillar jag C# mer som programmerngssråk än VBscript.

Men det är fortfarande en hel del barriärer att ta sig över.
Tar ett par exempel här:

1. Jag har skapat ett dataSet och gjort några frågor som jag sedan kopplar till ett formulär med autopostback på ett gridview. Direkt uppstår en sak att om jag har en databas där jag har ett int fält för kön hur får jag ut det att det står man eller kvinna.
Eller kan jag på något sätt i applikationen programmera så attvärdet från datbasen visas på ett speciellt sätt. Eller en länk hur får jag att det visas en bild istället för text.

Om jag har t.ex. ett veckoschema eller något annat som jag ska mata ut från databasen så funkar ju inte direkt en tabell med fasta rader och kulmner utan där vill man kanske använda divar med absolut positionering. Eller att man vill ha en tabell där man sammanfogar två kolumner beroende på ett värde i databasen. Hur gör man detta?

2. Om jag vill ha ett sökformulär med typ efternamn och förnamn, stad
Och så vill jag ha en sql-sats som anpassar sig efter vad man fyllt i. I asp brukar jag skriva dynamiska sql-satser. så att frågan anpassar si efter vad man fyllt i. Kanske inte så snyggt men väldigt smidigt. Hur gör man detta i .NET?

Exempel:
sqlString = "Select * from users where 1 = 1 "
If firstname <> "" Then
sqlString = sqlString &_
"And firstname = "& firstname &" "
End If
If lastname <> "" Then
sqlString = sqlString &_
"And lastname = "& lastname &" "
End If
osv....

Medlem sedan aug. 20003 575 inlägg
#8

Med C# Så byter du ut &-tecknen mot +-tecken.

Sedan kan du skriva

sqlString += nästa textstycke..

istället för sqlString = sqlString + nästa textstycke.

Medlem sedan dec. 2005664 inlägg
#9

1. Detta kan du sköta i din sql-sats.
2. I dinna klasser som bör ligga åtskillt från användargränssnittet skapar du metoderna. Där kan du returnera ett dataset eller datatable som med samma logik som du använt i asp. Du bör dock använda dir av parametrar för sökfälten.

Medlem sedan dec. 19996 721 inlägg
#10

Det går inte att komma ifrån att vissa saker blir mycket krångligare att göra i ASP.NET. Är man en rutinerad ASP:are så kan det definitivt kännas väldigt krumbuktigt med en del saker, medan annat i stället blir rena drömmen. YMMV.

Addeladde skrev:

1. Jag har skapat ett dataSet och gjort några frågor som jag sedan kopplar till ett formulär med autopostback på ett gridview. Direkt uppstår en sak att om jag har en databas där jag har ett int fält för kön hur får jag ut det att det står man eller kvinna.

Det finns 49 olika sätt att lösa det på, men man kan begränsa sig till tre alternativ.

1. Plocka ut rätt format direkt från databasen. T.ex. med en CASE-sats (MSSQL) eller en IIF (Access)

SELECT CASE sex WHEN 0 THEN 'man' ELSE 'kvinna' END as sex, .....

2. Lägg en if-sats i ItemTemplate

<asp:TemplateField><ItemTemplate><%#((int)Eval("articleId"))==0 ? "man" : "kvinna"%></ItemTemplate> </asp:TemplateField>

eller gärna via en metod

<asp:TemplateField><ItemTemplate><%#GetSex((int)Eval("articleId"))%></ItemTemplate> </asp:TemplateField>

3. Ändra värdet i RowDataBound-eventet

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (int.Parse(((DataRowView)e.Row.DataItem)["apa"].ToString()) == 1)
                e.Row.Cells[0].Text = "man";
            else
                e.Row.Cells[0].Text += "kvinna";

        }
    }

Addeladde skrev:

Eller kan jag på något sätt i applikationen programmera så attvärdet från datbasen visas på ett speciellt sätt. Eller en länk hur får jag att det visas en bild istället för text.

För en länk kan du använda HyperlinkField och för en bild ImageField, och om inget funkar kan man alltid falla tillbaka på ett TemplateField, där man kan fixa allt efter behag.

Addeladde skrev:

Om jag har t.ex. ett veckoschema eller något annat som jag ska mata ut från databasen så funkar ju inte direkt en tabell med fasta rader och kulmner utan där vill man kanske använda divar med absolut positionering.

De inbyggda kontrollerna är i princip uppbyggda för att skapa tabeller. Med hjälp av en Repeater kan du dock bestämma helt vad som skapas. Det är dock inte otroligt att det blir bättre att skapa DIV:ar etc. dynamiskt, gärna genom en UserControl, så att den kan återanvändas på flera sidor.

Addeladde skrev:

Eller att man vill ha en tabell där man sammanfogar två kolumner beroende på ett värde i databasen. Hur gör man detta?

Se exemplen ovan.

Addeladde skrev:

2. Om jag vill ha ett sökformulär med typ efternamn och förnamn, stad
Och så vill jag ha en sql-sats som anpassar sig efter vad man fyllt i. I asp brukar jag skriva dynamiska sql-satser. så att frågan anpassar si efter vad man fyllt i. Kanske inte så snyggt men väldigt smidigt. Hur gör man detta i .NET?

Helst ska man köra med stored procedures, som då själv kan ta hänsyn till att ett eller flera inargument är tomma. Det går även utan SP, förresten


SELECT blablabla FROM bliblibli WHERE (@firstname='' or firstname=@firstname) AND (@lastname='' or lastname=@lastname) ....

Det kan dock finnas tillfällen då en dynamiskt skapad fråga är det bästa (även om man bör undvika det i det längsta). Ditt exempel skulle kunna skrivas...


StringBuilder sb=new StringBuilder ("Select * from users where 1 = 1");
SqlCommand cmd=new SqlCommand(conn);
if (!firstname.Equals(string.Empty))
{
   cmd.Parameters.Add("@firstname",SqlDbType.VarChar,50).Value=firstName;
   sb.Append(" AND firstname=@firstname");
}
if (!lastname.Equals(string.Empty))
{
   cmd.Parameters.Add("@lastname",SqlDbType.VarChar,50).Value=lastname;
   sb.Append(" AND lastname=@lastname");
}
 
cmd.CommandText=sb.ToString();

Här har jag använt StringBuilder eftersom det är ett smidigt och prestandasnålt sätt att bygga upp en sträng, bit för bit.

Använd alltid parametriserade frågor. Det är spöstraff på att inte göra det, om man har möjligheten.

Medlem sedan dec. 2005664 inlägg
#11

emission skrev:

Här har jag använt StringBuilder eftersom det är ett smidigt och prestandasnålt sätt att bygga upp en sträng, bit för bit.

Det är igentligen pettitesser, men är inte en stringbuilder precis tvärtom vid mindre antal konkateneringar?

Medlem sedan jan. 20013 406 inlägg
#12

Hej och tack för alla svaren. Tror dock att detta kan vara nyttigt för många.

Detta är en tabell som genereras av asp men jag kan tänka mig att detta är svårt att få till med .net?

dump.gif
Medlem sedan dec. 19996 721 inlägg
#13

cok skrev:

Det är igentligen pettitesser, men är inte en stringbuilder precis tvärtom vid mindre antal konkateneringar?

Det stämmer alldeles utmärkt. I fallet ovan, med bara två konkateneringar, så blir det antagligen en nettoförlust att använda StringBuilder. Jag ville mest få med den klassen, för att visa för Addeladde att den fanns. Vinsterna kommer dock tämligen snabbt, när man får fler konkateneringar.

Medlem sedan dec. 19996 721 inlägg
#14

Addeladde skrev:

Hej och tack för alla svaren. Tror dock att detta kan vara nyttigt för många.

Detta är en tabell som genereras av asp men jag kan tänka mig att detta är svårt att få till med .net?

Nej, inte särskilt. Det finns ingen färdig kontroll, men med en asp:repeater eller asp:table skulle man komma långt. Ställ man bara rätt fråga till databasen så blir det enkelt.

Medlem sedan jan. 20013 406 inlägg
#15

Sitter nu och har gjort en template med följande kod:

 <a href="default.aspx?rostID=<%#Eval("rostID")%>"><img src="ikoner/delete18.gif" alt="Radera" style="width:18px; height:18px; border:0;" /></a>

Nu vill jag även få med det som postats genom autopostback nämligen @rostSprakID hur gör jag detta?

Sedan vill jag att ett visst värde i min list ska vara default. hittar ingen inställning för det.

Medlem sedan dec. 19996 522 inlägg
#16

De inbyggda kontrollerna är i princip uppbyggda för att skapa tabeller.

Antar att du har koll emission men andra kanske inte vet om detta projekt, http://www.asp.net/cssadapters/

Medlem sedan jan. 20013 341 inlägg
#17

Sen vill jag gärna slå ett slag för genericcollections istället för dataset/dataadapters, mycket smidigt att arbeta med.

264 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)