MVC3 Razor语法。如何将此ASP.NET样式转换为Razor。 (在引号内也有问题)

时间:2010-11-25 10:37:25

标签: asp.net-mvc asp.net-mvc-3 razor

任何人都可以将此ASP.NET语法转换为RAZOR语法吗?我无法将其“一对一”转换为Razor语法。

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

以下不起作用(抱怨CS0201:只能使用赋值,调用,递增,递减和新对象表达式作为语句)

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

并且这不起作用(突然在页面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='ChangeThemeTo_@i'>@i</a></text>
       ;}
})

似乎@i在id ='ChangeThemeTo_ @ i'中停止了结束文本标记的工作。如果我删除'@'元素有效。但是获得与第一次转换尝试相同的错误(CS0201)。

删除lambda的用法,这是有效的,但只有当我从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> } }

2 个答案:

答案 0 :(得分:2)

首先,我认为你过度使用@符号会给你带来问题。尝试:

@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='ChangeThemeTo_@i'>@i</a></text>
    }
}

修改

对于你没有正确写出id属性的最新问题,请尝试使用string.Format:

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

或简单地连接它们:

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

答案 1 :(得分:0)

所以显然你需要在代码之前使用文本来使标记解析器工作

@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="ChangeThemeTo_@(theme)">@theme</a>
}

以上是您的代码工作所必需的一切。您不需要使用text标记的原因是因为text只是一个看起来像html的模型html标记,因此它会强制解析器进入html模式。由于真正的html标签做同样的事情,你不需要使用文本。您需要在id标记中使用@(theme)作为第二个锚标记的原因可能是因为它看起来类似于电子邮件地址,并且解析器被告知忽略看起来像电子邮件地址的任何内容。您可以通过尝试ChangeThemeTo_ @theme之间的空格来验证这一点,您会发现它有效。 @()用于强制编译器识别()之间的代码。我希望这有助于您更好地理解解析器。