3

我正在尝试让 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 中修复。

4

1 回答 1

2

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

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

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

于 2013-03-11T02:44:57.407 回答