Razor v2中的条件属性

时间:2012-11-28 20:14:49

标签: asp.net-mvc razor asp.net-mvc-4 razor-2

我试图让Razor 2中的条件属性支持起作用,但对于我的生活,它的​​表现并不像预期的那样。

我的HTML输出看起来像这样......

<label class="radio inline"><input checked="true" id="ActivationType" name="ActivationType" type="radio" value="0">Option 0</label>
<label class="radio inline"><input checked="false" id="ActivationType" name="ActivationType" type="radio" value="1">Option 1</label>

现在这个HTML的问题在于,即使我希望选项0被选中,选项1也是实际检查的内容。现在这个HTML由MVC中的以下代码输出,ans位于DisplayTemplate中。

<label class="radio inline">@Html.RadioButtonFor(x => x, "0", new{@checked = Model.HasValue && (int)Model.Value == 0})Option 0</label>
<label class="radio inline">@Html.RadioButtonFor(x => x, "1", new{@checked = Model.HasValue && (int)Model.Value == 1})Option 1</label>

问题在于,仅仅存在checked属性就足以让浏览器将其视为已检查,无论其实际值如何。因此,Razor 2(据称)中的一个特性是,如果属性的值为null,则为空字符串或false,表示属性本身不会被呈现。我期望看到的是......

<label class="radio inline"><input checked="true" id="ActivationType" name="ActivationType" type="radio" value="0">Option 0</label>
<label class="radio inline"><input id="ActivationType" name="ActivationType" type="radio" value="1">Option 1</label>

现在我已经注意到StackOverflow上有很多问题,所以我显然不是唯一一个在这个问题上挣扎的人。事情是没有一个问题似乎有一个坚实的答案。我甚至在我的webconfig中添加了一个程序集重定向,以确保它使用正确版本的Razor,因为我确实将此应用程序从MVC3迁移到了MVC4

<dependentAssembly>
  <assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>

有没有人对此有什么好运?

更新:我实际上是在尝试获取一组单选按钮,让我以编程方式确定是否检查它们而不必定义代码块,我在每个代码块中创建一个新的字典复选框以避免渲染没有值的属性。

这是MVC中的一个问题,如此处所指出的那样(MVC3 EditorTemplate for a nullable boolean using RadioButtons)但是我希望摆脱解决方法,因为它声称已在Razor2 / MVC4中修复。

1 个答案:

答案 0 :(得分:2)

从MVC 4开始,我还发现条件属性在html辅助方法中不起作用。如果将条件属性直接放在html标记中,例如

<input checked="@(Model.HasValue && (int)Model.Value == 0)" id="ActivationType" name="ActivationType" type="radio" ...

你会发现它会起作用。传递disabled属性时遇到了类似的问题。希望有所帮助。