Html.Raw不工作,调试代码与视图不匹配

时间:2016-12-06 04:50:48

标签: asp.net-mvc razor

处理不使用内置验证的页面。当我的代码中有以下行时:

...
<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>

无论我放入什么?:块。试过? “猪油”::“隐藏”而且失败并且总是呈现“”。

我已经验证了Model.FieldsInError属性不是null并且具有有效的字符串。我已经尝试过HashSet和List。

当我调试并逐步浏览视图时,会突出显示错误的区域。

使用VS2013 sp5。

1 个答案:

答案 0 :(得分:0)

好的,所以它看起来像是Razor视图引擎中的一个错误。斯蒂芬打破报价逻辑的想法确实有效。非常欣赏。

因此,对于其他任何人看到这一点,只需将逻辑排除在类定义之外:

@{ 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>

然而,这确实会对控制器内部的视图结构产生依赖性,这是邪恶的,所以我建议使用Stephen的方法来保持视图和控制器独立于MVC方法。