25. januar 2006 - 22:31Der er
24 kommentarer og 1 løsning
.net 2.0 og namespaces
Hejsa E
Hvad er nu det her .NET 2.0 for noget?
Nu er jeg endelig ved at fatte bare lidt af .NET 1 og så kommer der en toer og laver om på det hele...
Normalt har man et namespace, men det er væk i 2.0, i stedet har man partial klasser, men de duer da ikke til en dyt.
jeg har en masse funktioner jeg gerne vil kalde fra flere forskellige filer, og førhen har der heller ikke været noget bøvl med det, jeg har bare lavet en funktions klasse og kaldt den fra mine andre sider. Functions f = new Functions(); int i = f.hentID();
Nu sker der ikke noget når jeg prøver at få fat i min funktions klasse, for de er ikke i samme namespace...
Når jeg så prøver at lave et namespace får jeg en fejl:
namespace qe { public partial class Vin_vin : System.Web.UI.Page {
der kommer en bølge lige efter vin og nogle fejlmeddelser fra nogle underlige sider som ikke findes
Error 1 'ASP.vin_vin_aspx.GetTypeHashCode()': no suitable method found to override c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\vgadm\5980e440\a316b967\App_Web_qmayu3qj.0.cs 767
men også en fejl der henviser til ovenstående bølge: Error 4 Make sure that the class defined in this code file matches the 'inherits' attribute, and that it extends the correct base class (e.g. Page or UserControl).
Kan nogen give mig en god forklaring på hvorfor der ikke er namespaces i 2.0 og hvordan jeg løser dette problem ?
Der er namespaces i 2.0, stol trygt på det. Jeg har ikke set din fejl før, men et gæt er at du bruger "partial" keywordet på en klasse der ikke er partial. Prøv at fjerne det.
Partial er opfundet af MS for at kunne dele en klasse op over flere .cs filer og på den måde "skjule" det visual-designer-specifikke auto genererede kode for dig (hvilket de mener skulle gøre det mere simpelt - jeg hælder mest til det modsatte).
De underlige sider der ikke findes er i øvrigt ASP.NET's cache af dine .aspx filer.
Der er skam namespaces i .NET 2.0 og de fungerer på samme måde som i 1.x :)
Forskellen ligger i at VS som default anvender partial klasser til codebehind filer i VS2005 og at websider som udgangspunkt erklæres i et default namespace (grundet at man sjældent ønsker adgang til codebehinden for en side fra andre sider udenom et register tag og at hver side som standard kompileres enkeltvis).
Dit problem ligger derfor ikke i at du har erklæret et namespace for din klasse, dit problem er at du i din Page erklæring ikke inkluderer dette namespace i Inherits propertien og at din ASPX som konsekvens heraf ikke kan finde codebehind-erklæringen.
Partial klasser er iøvrigt ganske praktiske, I det aktuelle tilfælde betyder det bl.a. at du automatisk har adgang til alle serverside controls erklæret i din aspx fra codebehinden (hvor du i 1.x skulle reerklære disse i codebehinden, omend VS ofte gjorde dette for en hvis man anvendte WYSIWYG funktionaliteten i VS)
malkor: jeg vil umiddelbart gå ud fra at den fejlbesked kommer hvis man i Inherits propertien glemmer at angive namespacet - derfor jeg formoder at det blot er det der er galt :)
trumf: Der bliver heller ikke auto-oprettet namespaces i størrer udgaver af VS, det skyldes ganske enkelt at MS har vurderet at det ikke giver specielt meget mening for ASPX/Codebehind relationer - har man behov for at tilgå kode i andre codebehind-filer end den der tilhører den aktuelle side så tyder det snarere på at man bør genoverveje sit kodedesign :)
tjah i 2.0 er der kommet en mulighed for at smide klassefiler i App_Code som automatisk refereres i dine sider.
Den løsning giver jeg dog personligt ikke meget for da jeg mener det også er udtryk for "dårligt design". Jeg foretrækker at oprette et library projekt i solutionen og referere den på traditionel vis.
Nej, den er som noget angiver til data, du kan bare oprette en ny mappe og kalde den "App_Code", VS finder selv ud af at der er tale om en såkaldt "speciel mappe".
At lave et library er dog ikke specielt meget sværere, du højreklikker bare på din solution og vælger Add -> New Project og angiver at det skal være et "Class library". Så kan du så blot oprette klasser derunder og tildele dem et namespace. Derefter skal du højreklikke på dit webprojekt og vælge "Add Reference" --> Project og så vælge dit class library i listen. Derefter har du så adgang til klasserne fra alle dine codebehind filer ved at erklære namespacet.
Nåh nok om det, jeg må have fået slettet den mappe. Jeg har fået svar på mit spm, men jeg har desværre ikke fået adgang til til de funktioner jeg har lagt i den anden klasse fil, jeg prøver at tilgå dem som jeg plejer i 1.1, men det virker ikke, selvom de nu er i samme namespace.
hvordan får jeg adgang til funktionen GetTotalNumItems der ligger i filen Functions.cs fra vin.aspx.cs ?
namespace qe { public class Functions { public Functions() { // // TODO: Add constructor logic here //
}
public int GetTotalNumItems(string SP, int dealerID) {
Jeg er kommet med et lille bud på hvad problemet kan skyldes, omend jeg næsten vil tro du har checket det, men vil bare lige være sikker inden jeg kigger nærmere på det :)
Klasse biblioteker er ikke understøttet i visual web developer, der skal man have en fuld version http://msdn.microsoft.com/vstudio/products/compare/ Jeg har kigget på en standard den koster bare 2600,- http://www.edbpriser.dk/Listprices.asp?ID=177636 Jeg ved ikke om jeg vil investere i den, for jeg får nok alligevel en af mit arbejde når vi går over til 2005, hvilket vel ikke kan tage så lang tid endnu...
App_Code kan oprettes ved at højreklikke på projektet, så jeg giver den en chance...
Undskyld hvis jeg snylter på dette spm, men nu hvor jeg har din opmærksomhed, så er der altså bøvl med den App_Code (som du godt nok heller ikke anbefaler) I følge dette ex: http://msdn2.microsoft.com/library/we4hy2z9.aspx som man må mene skulle være rigtigt, har jeg lavet mit helt magen til, men det virker bare ikke, kan du evt lige se hvad jeg måske overser.
min klasse i App_Code: public class Constants { public int numResult = 30; }
På siden hvor jeg kalder den: public partial class brugere_medlemmer : System.Web.UI.Page { Constants cnt = new Constants(); int numResult = cnt.numResult; Der er bølge under nederste cnt og en fejl: A field initializer cannot reference the nonstatic field, method, or property 'brugere_medlemmer.cnt' Constants er grønne så vwd kan godt se klassen, men åbenbart ikke den instans jeg lige har oprettet!!!
Ahh den skulle bare kaldes inden i en funktion!!! det vidste jeg jo egentligt godt :)
Synes godt om
Ny brugerNybegynder
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.