Archiv für den Monat August 2012

MVC – Namespace in Views einbinden per web.config für Razor Projekte


Wer in einem View nicht immer alle Namespaces per Hand angeben möchte die verwendet werden, der kann diese in der web.config ablegen. Hier ist aber zu beachten, das es in einem MVC Projekt zwei web.config Dateien gibt. Eine direkt im Hauptpfad und eine unter den Views.

image

Damit der Namespace auch erkannt wird, muss dieser in der web.config unter den Views eingetragen werden. In dieser Datei muss man auch aufpassen das man den Namespace an der richtigen Stelle ablegt. Denn hier gibt es auch zwei Tags die “pages” heißen und wo man den Namespace ablegen kann. Einmal unter “system.web” und dann gibt es noch “system.web.webPages.razor”. Damit die Namespaces im View auch gefunden werden müssen diese unter “system.web.webPages.razor” abgelegt werden.

image

Nur dann werden diese auch im View erkannt und können auch per Intellisense verwendet werden.

Advertisements

MVC–Global Resources einbinden mit Public Modifier


Um eine MVC Anwendung zu lokalisieren habe ich bereits hier beschrieben worauf man achten muss. Dabei habe ich auch darauf hingewiesen, das es sich um einen “Public” Zugriffsmodifizierer handeln muss, damit die Ressourcen Effektiv in MVC eingesetzt werden können. Auch das wenn man eine globale Ressource anlegt, diese den Zugriffsmodifizierer  auf “Internal” setzt und man diesen nicht verändern kann.

Es gibt noch einen weiteren Weg um diese Einstellung zu umgehen. Dazu müssen einfach die Eigenschaften der jeweiligen Ressource angepasst werden. Dazu müssen die Folgenden Einstellungen geändert werden:

  • Benutzerdefiniertes Tool einstellen auf: PublicResXFileCodeGenerator
  • Buildvorgang umstellen auf: “Eingebettete Ressource”
  • Namespace des Benutzerdefinierten Tools: “BeliebigerName” (Bei mir hat hier der Name “Resources” nicht funktioniert, aber z.B: “GlobalRessources” ging problemlos.)

imageimage

Durch das Umstellen des benutzerdefinierten Tools wird die Generierung auf Public umgestellt und die Resources können dann auch problemlos in den Attributen in den MVC Models verwendet werden.

Es können dabei auch alle Ressourcen gleichzeitig markiert werden und die Änderungen könne für alle gleichzeitig übernommen werden.

Quelle:

http://holyhoehle.wordpress.com/2010/02/20/making-global-resources-public/

Projektupdate von EF4 .Net 4.0 auf EF5 .Net 4.5


Bei diesem Beitrag handelt es sich nur um die Erfahrungen die ich bei einem Update meiner Projekte gemacht habe. Ich musste keine weitere Recherche Unternehmen, da das Update bei mir “Problemlos” verlaufen ist. Daher werde ich hier nur die Schritte aufzählen die ich durchgeführt habe um das Update auszuführen.

Ich habe dabei ein EF4.x Projekt mit .Net 4.0 mit DBContext upgegraded.

  • Upgrade des Projektes in dem das EF Projekt enthalten ist auf .Net 4.5 in den Projekteigenschaften. EF5 läuft zwar auch mit .Net 4.0 aber hier werden z.B: keine Enums unterstützt, diese stehen nur zur Verfügung wenn auch .Net 4.5 genutzt wird.

image

  • Installation des EF5 RC für das EF Projekt mit Hilfe der NuGet Konsole (-pre steht hier für Prerelease). Ein Update war bei mir nicht möglich, hier kam eine Fehlermeldung das er das “alte” Packet nicht finden konnte obwohl ich auch EF4 mit NuGet installiert hatte. aber eine Installation war auch problemlos möglich.
PM> Install-Package -ProjectName EFDataModel EntityFramework -pre
  • Löschen des alten EF4 Eintrages aus der “packages.config”, damit dort als EF Eintrag nur noch der EF5 Eintrag enthalten ist.
  • Da ich bei mir den DBContext verwendet habe, musste ich noch die beiden Dateien “MeinEFName.Context.tt” und “MeinEFName.tt” aus dem Projekt entfernen. Denn diese müssen mit einem neuen DBContext Generator für EF5 erstellt werden. Dazu musste ich eine Erweiterung installieren “EF 5.x DbContext Generator for C#”.

image

  • Erstellen der neuen *.tt Dateien über das edmx Model “Codegenerierungselement hinzufügen” und Auswählen des passenden Code Generators für EF5. Danach waren auch die *.tt Dateien wieder auf dem aktuellen Stand.

image

image

  • Upgrade war damit abgeschlossen und alles funktionierte bei mir wieder wie vorher.

EF5 – “model first” Datenbank Updates mit VS 2012


Nach einem guten Abend an Recherchearbeit, um herauszufinden ob es möglich ist, dass man evtl. direkt im EF5 Framework oder über EF Tools die Möglichkeit hat für den “model first” Ansatz seine Datenbank nach einer Modeländerung zu aktualisieren. Habe ich leider keine Integrierte Lösung finden können. Wenn hier jemand andere Erfahrungen gemacht hat, dann freue ich mich hier sehr über einen passenden Lösungsvorschlag oder Ansatz.

Außerdem habe ich einen Feature Request auf der EF Seite dafür gestartet und ich freue mich über jeden Vote, den ich bekommen kann für den Request, Voten könnt Ihr ohne euch anzumelden auf der folgenden Seite:

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/3065564-ef5-model-first-genrate-db-update-script

Visual Studio – SQL Schemavergleich zum Aktualisieren der Datenbank

Die einzige Lösung die ich hier aktuell vorschlagen kann, ist es den Integrierten Schemavergleich im Visual Studio für Datenbankupdates zu nutzen.

Nachteile dieser Lösung:

  • Nicht direkt in den EF Modellierungsprozess eingebunden
  • Man benötigt zwei Datenbanken – einmal die Originaldatenbank die aktualisiert werden soll und dann die neue Datenbank mit allen Updates, damit ein Vergleich erstellt werden kann mit der Originaldatenbank.

Wichtige Hinweise beim Durchführen von Modelländerungen im edmx Model

Außerdem muss darauf geachtet werden, wenn man in einem edmx Modell einer Klasse neue Member hinzufügt. Hier muss “Null” angegeben werden oder ein Default Wert hinterlegt werden. Denn sonst kann später kein Updatescript vom Schemavergleich erstellt werden. Im edmx Model können zwar Standardwerte eingestellt werden, diese werden jedoch nicht im generierten SQL eingebunden. Daher muss dies von Hand angepasst werden.

Im Folgenden lege ich für den Namen den Standardwert “Maus” fest, wenn man dann aber über

image

“Datenbank aus Modell generieren” das passende SQL Script generieren lässt,

image

dann sieht der Teil in dem die Tabelle angelegt wird folgendermaßen aus:

-- Creating table 'TiereSatz'
CREATE TABLE [dbo].[TiereSatz] (
    [ID] int IDENTITY(1,1) NOT NULL,
    [Name] nvarchar(max)  NOT NULL,
    [Art] nvarchar(max)  NOT NULL
);

Hier wird aber das Folgende Script benötigt, damit später auch ein Updatescript erstellt werden kann, denn wenn in der jeweiligen Tabelle der späteren Zieldatenbank bereits Werte enthalten sind, kann kein Update durchgeführt werden. Da z.B. schon die Tabelle existierte mit dem Member “Art” und hier bereits Werte eingetragen sind muss bei einem Update entweder der default Wert gesetzt werden oder null zugelassen sein für die neue Spalte “Name”.

-- Creating table 'TiereSatz'
CREATE TABLE [dbo].[TiereSatz] (
    [ID] int IDENTITY(1,1) NOT NULL,
    [Name] nvarchar(max)  NOT NULL default 'Maus',
    [Art] nvarchar(max)  NOT NULL
);

Der “Name” kann auch ”Null” sein, dann gibt es keine Probleme beim Hinzufügen der Spalte, wenn man im Designer “Null-Werte zulassen” auf “True” stellt, dann wird das folgende Script generiert welches auch funktioniert.

-- Creating table 'TiereSatz'
CREATE TABLE [dbo].[TiereSatz] (
    [ID] int IDENTITY(1,1) NOT NULL,
    [Name] nvarchar(max)  NULL,
    [Art] nvarchar(max)  NOT NULL
);

Erstellen des Schema Vergleiches mit Visual Studio und Updaten der DB

Sobald beide Datenbanken eingerichtet sind, zum einen die “alte” Datenbank die aktualisiert werden soll und die “neue” Datenbank in der alle Änderungen enthalten sind, dann können wir im Visual Studio im Menü einen neuen Schemavergleich erstellen.

image

Hier kann man jetzt das Ziel und die Quelldatenbank auswählen

image

Die Quelle ist bei uns die “neue” Datenbank die alle Updates enthält und das Ziel ist bei und die “alte” Datenbank in der die Änderungen durchgeführt werden sollen.

Die Auswahl der passenden DB findet über ein einfaches Menü statt.

image

und sobald beide Datenbanken ausgewählt wurden, steht die Funktion “Vergleichen” zur Verfügung

image

Wenn der Vergleich ausgeführt wurde, steht einem die Aktualisieren Funktion zur Verfügung oder das Erstellen eines SQL Scripts, welches man sich anschauen kann und dann meist schon in den ersten Zeilen erkennt ob es ein erfolgreiches update wird oder nicht.

image

Wenn man auf aktualisieren klickt, sieht man im VS dann auch ob alles geklappt hat

image

Jetzt sind beide Datenbanken auf dem „gleichen” Stand, was zumindest die Tabellen und Verknüpfungen betrifft.

Beispiel für einen Fehlschlag des Updates:

Wenn eine Aktualisierung fehlschlägt, empfehle ich das man sich das Update Script ausgeben lässt, damit man sieht wo der Fehler aufgetreten ist.

Das folgende generierte SQL Update Script kann nicht erfolgreich ausgeführt werden, da ich in der Tiertabelle die Spalte “Name” auf “Not Null” gesetzt habe. Hier kann man sehr gut erkennen wo der Fehler liegt und man kann dann im edmx Model oder dem Script für das Erstellen der neuen Datenbank die passenden Änderungen vornehmen und hier wieder testen ob ein Update möglich ist.

/*
Die Spalte "[dbo].[TiereSatz].[Vorname]" in der Tabelle "[dbo].[TiereSatz]" muss hinzugefügt werden,
besitzt jedoch keinen Standardwert und unterstützt keine NULL-Werte. Wenn die Tabelle Daten enthält,
funktioniert das ALTER-Skript nicht. Um dieses Problem zu vermeiden, müssen Sie der Spalte einen
 Standardwert hinzufügen, sie so kennzeichnen, dass NULL-Werte zulässig sind, oder die Generierung
 von intelligenten Standardwerten als Bereitstellungsoption aktivieren.
*/

IF EXISTS (select top 1 1 from [dbo].[TiereSatz])
    RAISERROR (N'Zeilen wurden erkannt. Das Schemaupdate wird beendet, da es möglicherweise zu einem Datenverlust kommt.', 16, 127) WITH NOWAIT
GO

MVC mit HTML5 Data-Attributes in Actionlinks


Gestern kam ich in die Verlegenheit und musste bei einem Actionlink ein “data”-Attribut hinzufügen und da bin ich auf stackoverflow auf einen Nützlichen Tipp gestoßen. Denn beim Hinzufügen von Custom Attributen zu einem Actionlink wird der Bezeichner von “data_icons” in das Attribut “data-icons” vom MVC Framework selbst umgewandelt und man muss nicht den umständlichen Weg mit einer Collection gehen.

Aus dem Code:



@Html.ActionLink("Zurueck zur Auflistung", "List", null, new {@class="btn btn-small", data_icon="icon-arrow-left"})


Wird dann das folgende HTML Element:

<a class="btn btn-small" data-icon="icon-arrow-left" href="#"> ...

VS 2012–MVC4 Twitter.Bootstrap Template (C# & Razor)


Erstellen und anpassen eines ASP.NET MVC4 Templates an das Layout von Twitter.Bootstrap. Dafür habe Ich mir ein neues ASP.NET MVC4 Projekt erstellt und per NuGet die Twitter.Bootstrap Dateien gezogen und daraus ein neues Projekttemplate erstellt, in dem ich alle Standardseiten sowie die T4 Templates auf die CSS Dateien von Twitter.Bootstrap umgestellt habe.

Das Template kann man hier herunterladen werden und wie man ein Template in VS 2012 einbindet findet Ihr hier. In der Projektvorlage befindet sich auch noch eine kurze Readme Datei, in der ich kurz beschrieben habe welche Änderungen ich am Projekt vorgenommen habe.

(Aktuell gibt es noch Probleme mit dem von mir erstellten Template, hier arbeite ich an einer Lösung, daher würde ich bei Interesse empfehlen einfach das Projekt auf Codeplex herunterzuladen. Ich habe jetzt noch eine alternative Zip Datei hinterlegt die das komplette Projekt umfasst inkl. NuGet Packages, welches einfach gestartet werden kann “MVC4.Twitter.Bootstrap – Project (only unzip and use – NO TEMPLATE).zip” dann einfach diese Datei nutzen.)

Als nächstes will ich noch kurz zeigen, wie ich das Template angepasst habe und auf welche Tools ich zurückgreife.

Meine Vorgehensweise zum Erstellen des Bootstrap Templates

Als erstes einfach ein neues MVC4 Projekt anlegen und dann die T4 CodeTemplates in das Projektverzeichnis kopieren. Die T4 CodeTemplates für MVC4 befinden sich für C# in dem Folgenden Ordner:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4/

hier muss der Ordner “CodeTemplates” einfach in das Basisverzeichnis der Anwendung kopiert werden. Wenn die T4 CodeTemplates in der Anwendung hinterlegt sind, dann werden beim Anlegen einer “Stark typisierte Ansicht” und beim Nutzen der passenden “Gerüstvorlage” (T4 Template) die Templates aus dem Projektverzeichnis als Basis verwendet.

imageimage

Damit die T4 Dateien im VS 2012 nicht nur wie simple Textdateien aussehen, sondern mit Syntaxhighlighting versehen werden, muss ein zusätzlichen Tool installiert werden. Ich habe hier z.B. tangible T4 Editor verwendet. Mit diesem Tool sieht dann eine *.tt Datei wieder wie “gewohnt” aus:

image

Danach konnte ich dann alle T4 Vorlagen anpassen und die passenden Bootstrap CSS Dateien einbinden. Hier handelt es sich nur um einen einfachen Vorschlag, der von jedem selbst angepasst werden kann.

Die Twitter.Bootstrap Dateien werden per NuGet herunterladen, dazu gehören die folgenden Twitter.Bootstrap Projekte:

  • Twitter.Bootstrap, aktuelle Version=2.0.4.1
  • Twitter.Bootstrap.Less, aktuelle Version=2.0.4

Da Ich ebenfalls die Twitter.Bootstrap.less Files per NuGet heruntergeladen und im Projekt mit eingebunden habe, muss noch der Editor angepasst werden. Damit man die *.less Dateien fast wie im normalen CSS Editor betrachten kann, muss folgende Einstellung am VS vorgenommen werden unter “EXTRAS->Optionen”:

image

die *.less Erweiterung muss dem CSS Quellcode Editor zugeordnet werden. Diese werden dann immer noch nicht 100%ig fehlerfrei angezeigt, aber es funktioniert Syntaxhighlighting und IntelliSense in den less Dateien.

Code und Projektanpassungen

Ich habe dem Projekt noch eine Custom Extension für das ValidationSummary “MyValidationSummary” hinzugefügt, damit die Fehlermeldungen im Twitter.Bootstrap Style angezeigt werden können. Außerdem habe ich die less Dateien erweitert um eine “_myCss.less” Datei unter “Content\less\_myCss.less”, hier werden die Bootstrap less Dateien eingebunden und wir können auf alle Variablen und Bezeichner der less Dateien vom Bootstrap zugreifen. Damit bleibt das NuGet Package Twitter.Bootstrap.Less updatefähig und wie können eigene Änderungen mit einbringen.

Update 08.08.2012:

Eigene JavaScript Erweiterung hinzugefügt, mit der es einfach möglich ist auch die Bootstrap Icons zu nutzen, wie genau ist im Projekt selbst beschrieben.

Update 23.09.2012:

Das Codeplex Projekt auf Twitter.Bootstrap 2.1.1 aktualisiert.

Quellen:

http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx

Mein Beispielprojekt “Mvc4Twitter.Bootstrap” gibt es auch auf CodePlex

Ich habe auch für dieses Beispiel ein Projekt auf CodePlex angelegt, welches man folgendermaßen finden kann:

https://squadwuschel.codeplex.com/

Dann unter “Source Code” –> “Browse” –> “MVC” –> “Mvc4Twitter.Bootstrap”

Hier könnt Ihr den kompletten Quelltext finden.

Wenn jemand einen Fehler im Template findet oder ich weitere Anpassungen vornehmen soll, dann bitte einfach hier per Kommentar melden.

VS eigene Projekt Templates “erstellen” und “installieren”


Um ein eigenes Projekt Template in Visual Studio zu erstellen muss man nur sein aktuelles Projekt so weit anpassen und erweitern bis den Stand erreicht ist den man für sein Template nutzen möchte.

Erstellen einer Vorlage mit VS 2010/2012

Der Menüpunkt “DATEI->Vorlage exportieren” öffnet den Assistenten für das Erstellen einer Vorlage. Hier einfach den vorgegebenen Schritten folgen und VS erstellt die Vorlage automatisch.

image

Das ganze funktioniert nur, so lange keine NuGet Packages enthalten sind. Wenn NuGet verwendet wird muss das ganze noch erweitert werden. Hier habe ich bisher keine “funktionierende” Lösung gefunden. BeiMVC Projekten besteht hier ebenfalls das Problem, das die Namespaces nicht richtig ersetzt werden und wenn man ein neues Projekt erstellt, muss der alte Projektnamespace in den Klassen mit dem neuen Namespace ersetzt werden.

Einbinden einer VS 2012 Projektvorlage

Wenn man eine Projektvorlage herunterlädt und möchte das diese beim Start von VS zur Verfügung steht, muss die *.zip Datei der Projektvorlage in das folgende Verzeichnis kopiert werden:

C:\Users\[Usewrverzeichnis]\Documents\Visual Studio 2012\My Exported Templates\

Dann wird  die Benutzerdefinierte Vorlage beim erstellen eines neuen Projektes in der Auflistung für z.B. C# Projekte ganz unten in der Liste angezeigt und kann wie gewohnt verwendet werden.

image_thumb2

 

VS2012SDK