if语句中的if()运算符(可能的bug)

时间:2014-02-20 16:26:42

标签: vb.net asp.net-mvc-3 razor if-statement

我刚遇到一个奇怪的问题( bug?

我正在尝试在razor中的if语句中初始化变量,我希望它具有取决于条件的值,因此我也使用内联if()运算符。

最小的错误示例是

@If true Then
    Dim ajaxurl As String = If(True, "a value", "another value")
End If

这个简单的代码将产生

  

If ”块未终止。所有“如果”语句必须以匹配的“结束时”结束。

当然我的实际用法更复杂( if statemens的更深层次嵌套以及更多内容),所以只需使用内联if()直接在哪里想放ajaxurl无法解决问题..

我知道我可以使用IIf()而不是if(),但仍然......有解释吗?


注意: 在代码块外工作时使用if()运算符..

所以

@If true Then
    @<span>@(If(True, "a value", "another value"))</span>
End If

工作得很好..


使用更实际的示例进行更新,以展示复杂性

@If Model.Count > 0 Then
    For Each item In Model
    @<li>
        @If Not String.IsNullOrEmpty(item.ArchivedObjectTitle) Then
            @<span class="label">@Html.CulturalText("ΣΥΝΔΕΕΤΑΙ ΜΕ", "LINKED WITH"):</span>@<br />
            If routeData("action").tolower <> "accompanying-directory" Then

                Dim directUrl As String
                Dim ajaxUrl As String = String.Empty

                If (Not Tools.IsGeophysical(item.ArchivedObjectType)) AndAlso item.ArchivedObjectType = ArchivedObjectsENUM.REGION Then
                    directUrl = Url.Action("region", New With {.id = item.ArchivedObjectID})
                    ajaxUrl = Url.Action("Archived-Item", New With {.id = item.ArchivedObjectID})
                Else
' ********************************************** '
' The following line which contains the If() cause the  '
' the first @If Model.Count > 0 Then to fail in parsing '
                    directUrl = Url.Action(If(Tools.IsGeophysical(item.ArchivedObjectType), "Geophysical-Item", "Archived-Item"), New With {.id = item.ArchivedObjectID})
                End If

                @<strong><a class="ajaxify" href="@directUrl" @Html.HtmlAttribute("data-url", ajaxUrl, ajaxUrl <> String.Empty)>@item.ArchivedObjectTitle</a></strong>@<br />
            Else
                @<strong>@item.ArchivedObjectTitle</strong>@<br />
            End If
        End If

        @If item.HasMore Then
            @<a href="@Url.Action("Accompanying-Item", New With {.id = item.AccompanyingObjectID})" class="ajaxify more-info" data-title="@item.Title">&nbsp;</a>
        End If
    </li>
    Next
Else
    ...
End if

2 个答案:

答案 0 :(得分:3)

如果你的视图中出现过这种情况,我建议你创建一个HTML Helper来处理它(而不是在Razor中拥有所有的VB代码)。我想如果你将所有VB条件逻辑移到Razor之外,你就不会看到同样的错误行为。

您所看到的行为的解释是Razor不是用VB编写的(反之亦然)。

结果是你的Razor Views最终看起来很荒谬。例如:

@If True Then
    @Code
        Dim ajaxurl As String = (If(True, "a value", "another value"))
    End Code                      
End If

这不是最优雅的解决方案,但它应该可以解决您的问题。您的另一个选择是不使用三元条件运算符,只是开始使用常规If语句。

@If True Then
    Dim ajaxurl As String
    If True Then
        ajaxurl = "a value"
    Else
        ajaxurl = "another value"
    End If
End If

同样,你可能会写出最优雅的代码,但是如果你真的担心这种事情,那么VB可能不是最好的语言选择。

答案 1 :(得分:2)

由于if只包含代码块,请尝试将其包装在代码块中:

@Code
    If True Then
        Dim ajaxurl As String = If(True, "a value", "another value")
    End If
End Code