2012-10-02 1 views
6

Razor 2 (im Lieferumfang von MVC4 enthalten) scheint nicht vollständig abwärtskompatibel mit Razor 1 (von MVC3) zu sein.Fehler "Element nicht geschlossen" nach dem Upgrade von MVC3 auf MVC4

Seit dem Upgrade Ich habe einen Fehler:

The "[email protected](count" element was not closed. All elements must be either self-closing or have a matching end tag.

Der Code, der dies verursacht:

<[email protected](count == null ? null : " class='has-item'")> 

Was ist die Lösung für dieses?

Antwort

14

The Razor Parser für MVC 4 neu geschrieben wurde, presumably because:

The HTML5-specs clearly states that unclosed HTML-tags are supported, but Razor v1 didn't have an advanced enough parser to support this. Razor v2 now supports this with the elements listed in W3C's spec.

Die einfachste Lösung ist es, einen einzigen Raum vor dem @ Symbol hinzuzufügen:

<td @Html.Raw(count == null ? null : " class='has-item'")> 

jedoch bedingte Attribute in Razor mit MVC 4 haben eine elegantere Syntax.

<td class="@(count == null ? null : "has-item")"> 

Wenn ein Attributwert verrechnet wird zu null, wird das Attribut aus dem Elemente weggelassen. So ist der Ausgang dieses Markup ist entweder:

<td> 

... oder ...

<td class="has-item"> 
1

Der Razor-Parser von MVC4 von MVC3 unterscheidet. Razor v3 verfügt über erweiterte Parserfunktionen und auf der anderen Seite striktes Parsing im Vergleich zu MVC3.

Beim Konvertieren von MVC3 in MVC4 kann es zu Syntaxfehlern kommen, wenn Sie Rasierersyntaxen nicht korrekt verwendet haben.

Lösung einiger gängiger Fehler Rasiermesser-Code, der in Razor nicht erlaubt v2 sind:

-> Vermeiden Server Blöcke in Ansichten verwenden, es sei denn es Variablendeklarationsteil ist.

-> Vermeiden Sie die Verwendung von @, wenn Sie sich bereits im Serverbereich befinden.

Don’t : @if(@variable) 
Recommended : @if(variable) 

Don't : @{int a = @Model.Property } 
Recommended : @{int a = Model.Property } 
Verwandte Themen