在不使用内置验证的页面上工作。当我的代码中有以下行:
...
<tr class="@{ Html.Raw(Model.FieldsInError.Contains("FirstName") ? "" : "hidden"); }" id="valFirstName">
<td colspan="2" class="text-danger">@Login.Error_FName</td>
</tr>
...
输出看起来像:
<tr class="" id="valFirstName">
<td colspan="2" class="text-danger">@Login.Error_FName</td>
</tr>
不管我放在?:block中。尝试了?"猪油" ::"隐藏",这也失败了,总是呈现"。
我已经验证了模型。FieldSinError属性不是空的,并且具有有效的字符串。我尝试了标签和列表。
当我调试并浏览视图时,突出显示了错误的区域。
使用VS2013 SP5。
好的,所以它看起来像是剃须刀视图引擎中的一个错误。斯蒂芬(Stephen)从报价中违反逻辑的想法实际上是在起作用的。非常感谢。
因此,对于其他人看到的,只需将逻辑从类别中淘汰出来:
:@{ var className = Model.FieldsInError.Contains("FirstName") ? "hidden" : null; }
<tr class="@className" id="...">...</tr>
这将服务器上的逻辑留下。
对于我自己的代码,因为我不想在每个字段中这样做,所以我只是在页面末尾进行以下操作,以便通过客户端逻辑显示字段:
<script type="text/javascript" language="javascript">
$(function() {
var errors = @Html.Raw(Json.Encode(Model.FieldsInError));
for(var i = 0; i < errors.length; i++) {
$("#" + errors[i]).removeClass("hidden");
}
});
</script>
但是,这确实对控制器内部的视图结构产生了依赖,因此我建议斯蒂芬根据MVC方法使视图和控制器保持独立的方法。