2016-12-06 67 views
0

在不使用内置验证的页面上工作。当我在我的下面一行代码:Html.Raw无效,调试代码与视图不匹配

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

+0

你为什么使用'Html.Raw()'? - 这是输出未编码的html –

+0

因为在引号内部,你不能只说@ Model.FieldsInError.Contains(“SaveFailure”)? “”:“隐藏”或声明失败。 –

+0

你想在这里做什么? - 如果FieldsInError不包含“FirstName”,则添加一个'class =“hidden”'? –

回答

0

好吧,它看起来像剃刀视图引擎中的错误。斯蒂芬打破引号逻辑的想法确实奏效。非常感谢。

因此,对于任何人看到这一点,只是萧条的逻辑出来的类定义的,像这样:

@{ 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方法来保持视图和控制器独立。

+0

有id没有错误! –

+1

如果Razor引擎仅分配一个空值,它将省略属性。所以,'class =“@(Model.FieldsInError.Contains(”FirstName“)?null:”hidden“)”'应该可以工作。 –

+1

@TiesonT。这应该是一个答案,我会投它!也是它“看起来像一个bug”的原因是因为@ {Html.Raw(“”); }只是执行Raw()方法并抛出返回值。 @ Html.Raw()打印值。 – Andreas