代码之家  ›  专栏  ›  技术社区  ›  Wolf5

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

  •  1
  • Wolf5  · 技术社区  · 14 年前

    有人能把这个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>
           ;}   })
    

    这不起作用(突然它期望在第1行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>
           ;}
    })
    

    似乎id='changethemato@i'中的@i阻止了结束文本标记的工作。如果删除“@”,则元素有效。但得到的错误与第一次转换尝试(CS0201)相同。

    删除lambda的用法,这是有效的,但前提是我从id='changetheto'u中删除'@'

            @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 回复  |  直到 12 年前
        1
  •  2
  •   Steve Hobbs    14 年前

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

    @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>
    
        2
  •  0
  •   Buildstarted    14 年前

    所以很明显,在代码之前需要文本才能使标记解析器工作

    @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 标记是因为 文本 只是一个看起来像html的模型html标记,因此它强制解析器进入html模式。因为一个真正的html标签做同样的事情,你不需要使用文本。您需要使用 @(theme) 在您的id标记中,第二个锚标记可能是因为它看起来类似于电子邮件地址,解析器被告知忽略任何看起来像电子邮件地址的内容。你可以通过尝试 ChangeThemeTo_ @theme 在和之间有一个空格,你就会看到它起作用了。这个 @() 是否强制编译器识别 () 作为代码。我希望这能帮助您更好地理解解析器。