2010-11-25 4 views
1

Quelqu'un peut-il convertir cette syntaxe ASP.NET à la syntaxe RAZOR? Je ne peux pas le convertir "one to one" en syntaxe Razor.Syntaxe MVC3 Razor. Comment puis-je convertir ce style ASP.NET en Razor. (aussi questions avec @ entre guillemets)

<% 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 /> 
<% });%> 

Ce qui suit ne fonctionne pas (se plaint CS0201: Seule l'affectation, appel, incrément, décrément, et de nouvelles expressions d'objet peut être utilisé comme une déclaration)

@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> 
     ;} }) 

et cela ne fonctionne pas (tout d'un coup, il attend '}' en haut de la page 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> 
     ;} 
}) 

le Semble @i dans les id = 'ChangeThemeTo_ @ i' arrête la fin du texte balise de travail. Si je supprime le '@', l'élément fonctionne. Mais obtenez la même erreur que la première tentative de conversion (CS0201).

Retrait de l'utilisation de lambda, cela fonctionne, mais seulement si je retire le « @ » de 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> } }

Répondre

2

D'une part, je pense que votre surutilisation du symbole @ vous donne problèmes. Essayez:

@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> 
    } 
} 

Modifier

Pour votre dernier problème où il n'écrit pas sur l'ID attributs correctement, essayez d'utiliser string.Format à la place:

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

Ou tout simplement les concaténer:

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

Non. Tout est considéré comme du code dans i => {...}. Donc, pour sortir il semble @ doit être mis en face de . Comme mon deuxième exemple. Cela ne marche pas non plus ... On dirait que le Razor intellisense/compilateur ne fonctionne pas très bien dans les expressions lambda ...? – Wolf5

+0

Oui, je viens de le voir moi-même. Avez-vous essayé d'utiliser une construction for..each traditionnelle au lieu d'utiliser la méthode ForEach() pour faire défiler vos données? –

+0

Le code vs tags fonctionne beaucoup mieux quand je fais foreach() au lieu de l'expression lambda. Mais pas si j'ai le @i dans les citations sur le tag d'identification. Cela le brise. Et j'obtiens des erreurs de '}' manquantes sur la ligne 1, colonne 1 du code. – Wolf5

0

Donc apparemment vous avez besoin de texte avant e le code pour faire fonctionner l'analyseur de balisage

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

Ce qui précède est tout ce qui est nécessaire pour que votre code fonctionne. La raison pour laquelle vous n'avez pas besoin d'utiliser la balise text est que text est juste une balise html de maquette qui ressemble à html pour forcer l'analyseur à passer en mode html. Comme une vraie balise html fait la même chose, vous n'avez pas besoin d'utiliser du texte. La raison pour laquelle vous devez utiliser le @(theme) dans votre identifiant pour la deuxième balise d'ancrage est probablement parce qu'elle ressemble à une adresse e-mail et que l'analyseur doit ignorer tout ce qui ressemble à une adresse e-mail. Vous pouvez le vérifier en essayant ChangeThemeTo_ @theme avec un espace entre et vous verrez que cela fonctionne. le @() est là pour forcer le compilateur à reconnaître ce qui est entre le code (). J'espère que cela aidera votre compréhension de l'analyseur un peu plus.

+0

Merci. J'ai réussi à faire fonctionner mon code, mais même après avoir mieux compris l'analyseur, je n'arrive pas à le faire fonctionner correctement avec les expressions lambda car ces expressions sont entre '(' et ')', et tout est automatiquement analysé comme du code sauf vous le cassez avec @. Mais même dans ce cas, cela ne semble pas fonctionner car le compilateur (lors de l'exécution) recherche le code à exécuter et ne comprend pas les balises HTML. Vous obtenez une erreur CS0201 sympa (erreur de code attendue). Aujourd'hui, quand "tout est à faire" avec lambdas et linq, il serait bon de savoir comment l'utiliser avec Razor. – Wolf5