.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Februar 2008

VS2008 ASP.NET Web Application Project

26.02.2008 20:57:00 | Jürgen Gutsch

Gerade bin ich dabei mit dem VisualStudio 2008 eine ASP.NET Web Site in ein ASP.NET Web Application Projekt zu konvertieren. Ich habe eine neue Web Application angelegt und alle Dateien aud der alten Web Site in das neue Projekt kopiert. Bis dahin gab es nur das Problem, dass Klassen aus dem Verzeichnis "App_Folder" nicht gefunden wurden. Also habe ich das Verzeichnis in "classes" umbenannt. Anschließend habe ich per "find and replace" in den ASPX Dateien die Page Direktive CodeFile in CodeBehind umbenannt. (So hatte ich das aus dem VS2003 in Erinnerung.)

Dann ging erstmal garnichts mehr, da in den CodeBehinds kein Control auf den Seiten mehr erkannt wurde. Und was nun? Hm...

Ich weis nicht mehr aus welchem Grund ich im Solution Explorer ein Rechtsklick auf eine ASPX Datei gemacht habe, aber ich habe es getan. Und den Menüpunkt "Convert To Web Application" gefunden.

Ein Klick darauf, und das VS2008 erstellt mir zu der entsprechenden Datei eine Designer Klasse. Tolle sache. Nachdem ich das bei jeder ASPX und ASCX Datei gemacht hatte, konnte ich wieder ein erfolgreichen Build machen.

Mir stellt sich allerdings nebenher die Frage, wieso befindet sich der Kontextmenüpunkt mit dieser schlechten Beschriftung auf den ASPX Dateien und nicht auf der Solution? Wieso konvertiere ich eine Datei in eine Applikation? Hm...

Wenn es das für eine einzelne ASPX Datei gibt, muss es doch eigentlich auch für eine ganze Web Site gehen, oder? Wenn ich es weis, werde ich es hier schreiben...

EDIT:
Tatsächlich findet man den Menüpnkt auch bei einem Rechtsklick auf das Web Application Project
@Stefan, danke für den Hinweis :-)

EDIT:
Dank an Peter für folgenden Hinweis:
Was Scott Guthrie hier so schön für das VS2005 beschreibt gilt größtenteils natürlich auch für das VS2008.

Update zu Code-Metrik in der Express Edition

26.02.2008 17:59:00 | Klaus Bock

Gerade habe ich eine Mail vom Autor erhalten, dass in der neuen beta Version V2.4.0.8 anonyme Eigenschaften jetzt sauber geparst werden.

Hier ein Original Auszug:

Two bugs, numbers 85 and 86, have been fixed in a new sourceMonitor beta, V2.4.0.8.

Bug 85 applies to C# version 3.0: anonymous properties are now parsed properly.

Bug 86 is a parsing error that happened when an exit from a case statement (for example a return or a goto) was invoked inside a block.

 

Technorati-Tags: |

Benutzerdefinierten SOAP-Header in einem ObjectDataSource verwenden

21.02.2008 12:42:54 | Klaus Bock

Wie ich bereits in dem vergangenen Post Wie authentifiziere ich einen Client gegenüber einem Webdienst - Teil 4 angesprochen habe, ist es nicht ohne weiteres möglich einen WS-Proxy mit einem benutzerdefinierten SOAP-Header als Datenquelle für einen ObjectDataSource zu verwenden. Hier bietet sich das ObjectCreating-Ereignis an um dem ObjectDataSource mitzuteilen, dass eine spezielle Datenquelle Verwendet wird. Die MSDN sagt zum ObjectCreating-Ereignis folgendes:

Behandeln Sie ObjectCreating-Ereignis, um explizit einen anderen Konstruktor aufzurufen, und legen Sie die Instanz des resultierenden Objekts auf die ObjectInstance-Eigenschaft des zugeordneten ObjectDataSourceEventArgs-Objekts fest.

Liest sich erst mal ein wenig umständlich, ist aber in Wahrheit sehr einfach und genau dass was sich für dieses Problem anbietet.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Delete"
        InsertMethod="Insert" SelectMethod="GetData" UpdateMethod="Update"
        OnObjectCreating="SecureProxy">.....

</asp:ObjectDataSource>

Zunächst in der ASP-Seite ein ObjectDataSource-Element erzeugen wie immer. Das ObjectCreating-Ereignis kann im Markup definiert werden. Im folgenden Beispiel wird dem ObjectCreating-Ereignis die Methode SecureProxy übergeben.

Die Signatur der SecureProxy-Methode muss so gestaltet werden, dass sie zwei Argumente entgegen nimmt. Das erste Argument ist das oft verwendete sender vom Typ Object und das zweite muss vom Typ ObjectDataSourceEventArgs sein. Besagte Methode SecureProxy macht nichts anderes, als einen Instanz der SoapAuthHeader-Klasse zu erzeugen und die Felder der soeben erzeugten Instanz mit den benötigten Werten zu füllen. Nun muss diese Instanz der SoapHeader-Klasse nur noch an die Eigenschaft ObjectInstance des ObjectDataSourceEventArg übergeben werden und das Ziel ist erreicht. Klingt vielleicht etwas verwirrend, ist im Code aber sein einfach wie folgendes Beispiel zeigt.

protected void SecureProxy(object sender, ObjectDataSourceEventArgs e)
{
    // neue Instanz der SoapAuthHeader-Klasse erzeugen
    SoapAuthHeader authHeader = new SoapAuthHeader();
    // benötigte Werte zuweissen
    authHeader.Created = DateTime.Now;
    authHeader.Expires = 5;
    authHeader.UserName = SessionFacade.CurrentUsername;
    authHeader.IsEditMode = true;
    authHeader.HashValue = Fingerprint.CreateHash(new object[] {
        authHeader.Created, authHeader.Expires,authHeader.UserName,authHeader.IsEditMode });

    // SoapAuthHeader-Instanz denm WS-Proxy übergeben
    software.SoapAuthHeaderValue = authHeader;

    // Ws-Proxy Instanz an den ObjectDataSource übergeben
    e.ObjectInstance = software;
}
Technorati-Tags: |

Team System: Neuer Rekord auf dem Launch in Frankfurt!

21.02.2008 12:28:00 | Christian Binder

Danke an alle, die meine Sessions besucht haben! In meinen 3 Team System Sessions waren immerhin >1800 Teilnehmer und das Feedback war einfach super.

Das absolute Highlight, möchte ich auch allen, die keine Chance hatten auf den Launch zu kommen, nicht vorenthalten :-)

Sehen Sie in 10min, wie Sie mit Team System und dem Workitem Manager - dank hierarchischer Baumstruktur, intellegenter Statusaggergation und flexibler Spezifikationsverwaltung Ihr Projekt aufsetzen und durchführen.

Das Video zum Artiso Workitem Manager finden Sie unter folgendem vorläufigem Link.

Hier

PS: Danke an Thomas und Luka, für diese absolut gelungene Team System Erweiterung !!

Chris

Kaxaml - Das bessere Xaml Pad

17.02.2008 14:04:42 | Jan-Cornelius Molnar

Wer bereits etwas mit WPF gearbeitet hat kennt vielleicht das XAML Pad. Ein sehr schlankes Tool, das einem erlaubt, Xaml Code zu schreiben und das Ergebnis in einem "Split View" sofort angezeigt zu bekommen.

Xaml Pad ist zwar sehr partisch aber vom Fuktionsumfang doch etwas begrenzt. Doch jetzt gibt es eine Abhilfe namens Kaxaml.

Das Tool bietet eine ganze Reihe von Features wie

  • IntelliSense
  • Syntax Highlighting
  • Split View (Xaml, Preview)
  • Mehrere Dokumente in Tabs
  • Einen Color Picker
  • Snippets
  • Plugin System
  • uvm.

Ein must-have für jeden WPF Entwickler!

 

Kaxaml Webseite
http://www.kaxaml.com/

World of Warcraft meets Visual Studio

13.02.2008 20:18:51 | Jan-Cornelius Molnar

Visual Studio 2008 bringt viele Neuerungen mit sich, darunter auch neue Features, um die Entwicklungsumgebung zu erweitern.

Ein hervorragendes Beispiel ist das AddOn Studio for World of Warcraft, das auf der Visual Studio Shell, also dem Grundgerüst von Visual Studio basiert, und eine Umgebung für die Erstellung von World of Warcraft Addons zur Verfügung stellt.

Zum Weiterlesen

Visual Studio Shell
http://msdn.com/vsx/

AddOn Studio for World of Warcraft
http://www.codeplex.com/WarcraftAddOnStudio

Vortrag: Einführung in Microsoft .NET / Visual Studio 2008

12.02.2008 21:31:32 | Jan-Cornelius Molnar

Wie versprochen, stelle ich hier die Slides und die Beispiele meines Vortrags vom 12.02. online.

Powerpoint Slides
Download (pdf)

Beispiel Visual Studio IDE
Download (zip)

Beispiel Windows Forms
Download (zip)

Beispiel Web Forms
Download (zip)

 

Themenvorschläge für weitere Vorträge sind willkommen.

 

Ressourcen

Visual Studio Express Editions
http://www.microsoft.com/germany/express/

XNA Game Studio
http://creators.xna.com/Education/GettingStarted.aspx

ASP.NET Ressourcen clientseitig mit JavaScript nutzen

05.02.2008 10:47:00 | Jürgen Gutsch

In einer ASP.NET Anwendung in der relativ viel JavaScript genutzt wird, bekommt man spätestens dann Probleme, wenn man auch Meldungen und Texte die per JavaScript erzeugt werden, mehrsprachig ausgeben möchte.

Man könnte jetzt einfach alle Scripts serverseitig erzeugen und auf das WebForm rendern, bei vielen JavaScripts macht das allerdings keinen Sinn mehr. Selbst alle Scripts dynamisch über einen HttpHandler ausgeben zu lassen ist nicht sinnvoll, da dann alle Scripts nur als String im .NET Code vorliegen und nur schwer zu Ändern sind (fehlendes Syntax Highlighting, kein IntelliSense, etc).

Das Problem ist jetzt, wie stelle ich alle Resource Strings meiner Webanwendung clientseitig zur Verfügung? Wichtig ist, dass ich die bei einer neuen Ressource nicht wieder Änderungen an zwei Stellen vornehmen muss.

Einen HttpHandler zu benutzen steht außer Frage. Was ich aber nicht möchte, ist jeden Resource String einzeln in den Handler zu schreiben. Bis jetzt kannte ich keine Möglichkeit, eine Collection mit allen Werten aus den Ressourcen zu lesen. Die Beschreibung der ResXResourceReader in der MSDN brachte mich dann auf die annähernd optimale Lösung:

context.Response.ContentType = "text/javascript";
string resourceFilePath = context.Server.MapPath("~/App_GlobalResources/General.resx");
string resourceValue;
string resourceString;

context.Response.Write("var Resources = {\n"); // Start Namespace "Resources"
context.Response.Write("\"General\" : {\n");   // Start Class "General"
using (ResXResourceReader reader = new ResXResourceReader(resourceFilePath))
{
    IDictionaryEnumerator en = reader.GetEnumerator();
    while (en.MoveNext())
    {
        resourceValue = en.Value.ToString();
        resourceValue = resourceValue.Replace("\"", "\\\"");
        resourceValue = resourceValue.Replace("\r\n", "\\n");
               
        resourceString = string.Format("\"{0}\" : \"{1}\",\n",
            en.Key,
            resourceValue);
               
        context.Response.Write(resourceString);
    }
}
context.Response.Write("}\n"); // End Class "General"
context.Response.Write("};\n"); // End Namespace "Resources"

Dieser Handler erzeugt dann z. B: folgende Ausgabe:
var Resources = {
"General" : {
"Add" : "Hinzufügen",
"AllFields" : "Alle Felder",
"Apply" : "Übernehmen",
"AskDelete" : "Aktuellen Datensatz wirklich löschen?",
"Back" : "Zur letzten Seite",
"Cancel" : "Abbrechen",
"Change" : "Bearbeiten",
"CloseModalWindow" : "Schließen",
}
}

Der Handler kann dann ganz normal wie eine JavaScript Datei im WebForm eingebunden werden:
<script src="common/scripts/resources.ashx" type="text/javascript"> </script>

Das schöne an dieser Variante ist, das ich die Ressourcen wie im C# Code nutzen kann:
<asp:Button ID="btnDelete" runat="server" Text="Löschen" 
    onclick="if(confirm(Resources.Genaral.AskDelete))return false;" />

Nachteil an dieser Variante, bzw. eigentlich nur an dem Code des HttpHandlers oben, ist dass die Resource Datei hart reingeschrieben ist. Um das ganz zu optimieren, könnte man alle .RESX Dateien durchgehen, die z. B. unter „App_GlobalResources“ angelegt sind.

Des Weiteren ist die Internationalisierung noch nicht berücksichtigt. Das heißt bei der Ermittlung des Pfades zur Resource Datei muss die aktuelle Culture noch berücksichtigt werden, damit je nach Einstellung die richtigen Dateien gefunden werden. Z. B: („General.de-DE.resx“ für die Deutsche Ausgabe oder „General.en-US.resx“ für die US Amerikanische Ausgabe).

Regeln | Impressum