2010-11-25 18 views
1

Kann jemand diese ASP.NET-Syntax in RAZOR-Syntax konvertieren? Ich kann es nicht "eins zu eins" in Razor-Syntax konvertieren.MVC3 Razor-Syntax. Wie konvertiere ich diesen ASP.NET-Stil in Razor. (auch Probleme mit @ in Anführungszeichen)

<% Themes.ThemesAvailable().ForEach(i => 
    { 
     if (i.Equals(Themes.ThemeToUse)) 
     {%> 
     <a href="" id="A1" style="font-size:x-large;color:Red"><%:i%></a> 
     <%} 
     else 
     {%> 
     <a href="" style="color:Blue" id="ChangeThemeTo_<%:i%>"><%:i%></a> 
     <%} %> 
    <br /> 
<% });%> 

Die folgende funktioniert nicht (beschwert sich über CS0201: Nur Zuordnung, anruf, Erhöhung, Senkung und neue Objekt Ausdrücke können als Anweisung verwendet werden)

@Themes.ThemesAvailable().ForEach(i => { 
     if (i.Equals(Themes.ThemeToUse)){ 
     @:<a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a> 
     ;}else{ 
     @:<a href="" style="color:Blue" id='[email protected]'>@i</a> 
     ;} }) 

und dies nicht funktioniert (plötzlich erwartet er '}' am oberen Rand der Seite line1 col1)

@Themes.ThemesAvailable().ForEach(i => 
    { 
     if (i.Equals(Themes.ThemeToUse)){ 
     @<text><a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a></text> 
     ;} else { 
     @<text><a href="" style="color:Blue" id='[email protected]'>@i</a></text> 
     ;} 
}) 

scheint die @i innerhalb id = 'ChangeThemeTo_ @ i' von der Arbeit das Ende Text-Tag stoppt. Wenn ich das @ lösche, funktioniert das Element. Erhalten Sie den gleichen Fehler wie beim ersten Konvertierungsversuch (CS0201).

die Verwendung von Lambda-Entfernen, funktioniert dies aber nur, wenn ich das entfernen ‚@‘ von id = ‚ChangeThemeTo_i‘

 
     @foreach (var i in Themes.ThemesAvailable()){ 
      if (i.Equals(Themes.ThemeToUse)){
<a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a> } else {
<a href="" style="color:Blue" id='ChangeThemeTo_i'>@i</a> } }

Antwort

2

Für eine Sache, die ich Ihre Übernutzung des @ Symbol denken, dir gibt Probleme. Versuchen:

@foreach(var i in Themes.ThemesAvailable()) 
{ 
    if (i.Equals(Themes.ThemeToUse)) 
    { 
     <text><a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a></text> 
    } 
    else 
    { 
     <text><a href="" style="color:Blue" id='[email protected]'>@i</a></text> 
    } 
} 

bearbeiten

Für Ihre letzte Problem, wo es nicht die id auszuschreiben Attribute richtig, versuchen string.Format anstelle:

<a href="" style="color:Blue" id="@(string.Format("ChangeThemeTo_{0}", i))">@i</a> 

Oder einfach verketten sie:

<a href="" style="color:Blue" id="@("ChangeThemeTo_" + i)">@i</a> 
+0

Nein. Scheint alles innerhalb des i => {...} gilt als Code. Also zum Ausbrechen scheint es @ vor zu stellen. Wie mein zweites Beispiel. Das funktioniert auch nicht ... Scheint so, als ob der Razor intellisense/Compiler innerhalb von Lambda-Ausdrücken nicht gut funktioniert ...? – Wolf5

+0

Ja, das habe ich gerade selbst gesehen. Haben Sie versucht, ein traditionelles for..each-Konstrukt zu verwenden, anstatt die ForEach() -Methode zu verwenden, um Ihre Daten zu durchlaufen? –

+0

Der Code vs Tags funktioniert viel besser, wenn ich foreach() anstelle des Lambda-Ausdrucks. Aber nicht, wenn ich das @i innerhalb der Anführungszeichen auf dem ID-Tag habe. Das bricht es. Und ich bekomme Fehler von "}" in Zeile 1, Spalte 1 des Codes fehlt. – Wolf5

0

Also anscheinend brauchen Sie Text vor e Der Code, um den Markup-Parser zu aktivieren

Das obige ist alles, was notwendig ist, damit Ihr Code funktioniert. Der Grund, warum Sie das text-Tag nicht verwenden müssen, ist, weil text nur ein Mockup-HTML-Tag ist, das wie HTML aussieht, so dass es den Parser zwingt, in den HTML-Modus zu wechseln. Da ein echtes HTML-Tag das Gleiche tut, brauchen Sie keinen Text zu verwenden. Der Grund, warum Sie das @(theme) in Ihrem ID-Tag für das zweite Anchor-Tag verwenden müssen, liegt wahrscheinlich daran, dass es einer E-Mail-Adresse ähnelt und der Parser angewiesen wird, alles zu ignorieren, was wie eine E-Mail-Adresse aussieht. Sie können dies überprüfen, indem Sie ChangeThemeTo_ @theme mit einem Abstand dazwischen versuchen, und Sie werden sehen, dass es funktioniert. Die @() ist da, um den Compiler zwingt zu erkennen, was zwischen dem () als Code liegt. Ich hoffe, dass dies Ihrem Verständnis des Parsers ein wenig mehr hilft.

+0

zu verwenden Danke. Ich habe meinen Code zu arbeiten, aber selbst nachdem ich den Parser besser verstanden habe, kann ich keinen Weg finden, ihn mit Lambda-Ausdrücken gut zu arbeiten, da diese Ausdrücke zwischen '(' und ')' liegen und alles dazwischen automatisch als Code geparst wird Sie brechen es mit @. Aber selbst dann scheint es nicht zu funktionieren, da der Compiler (zur Laufzeit) nach ausführbarem Code sucht und die HTML-Tags nicht versteht. Sie erhalten einen schönen CS0201-Fehler (erwarteter Codefehler). Heute, wenn "alles mit Lambdas und Linq getan werden soll", wäre es schön zu wissen, wie man das mit Razor tatsächlich nutzt. – Wolf5

Verwandte Themen