我刚遇到一个奇怪的问题( 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"> </a>
End If
</li>
Next
Else
...
End if
答案 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