【发布时间】:2017-03-02 05:04:05
【问题描述】:
我有一个Hotel 模型,并且模型中有一个HotelPrice 列表。
我想要做的是当用户显示酒店详细信息页面时显示酒店价格信息,它们也可以是可编辑的。我在HotelPrice 实例上有一个breakfastIncluded 属性,我必须将其显示为单选按钮。
这是我的代码:
<div>
@{
foreach(var hotelPrice in Model.HotelPrices)
{
<label class="mt-radio-inline>
@Html.RadioButtonFor(hotelModel => hotelPrice.breakfastIncluded, "1", new { @checked = (hotelPrice.Breakfast.ToString() == "1") })Yes
<span></span>
</label>
<label class="mt-radio-inline>
@Html.RadioButtonFor(hotelModel => hotelPrice.breakfastIncluded, "0", new { @checked = (hotelPrice.Breakfast.ToString() == "0") })No
<span></span>
</label>
}
}
当我显示我的页面时(我还不能编辑部分),所有breakfastIncluded 属性的单选按钮都显示为未分配,最后一个单选按钮显示错误(即它必须是“是”但看起来像“不”)。
但是,当我通过浏览器的检查工具进行检查时,所有单选按钮的选中属性都显示正确(即,如果应该是“是”,则单选按钮的选中为真,而“否”的选中为假)。
我是 html 新手,我不知道为什么会这样。你能帮助我吗?提前致谢。
【问题讨论】:
-
您有多个问题 - 您不能使用
foreach循环将控件绑定到集合(请参阅 this answer)。而且您没有设置checked属性(RadioButtonFor()会在您修复视图时正确执行此操作(并且checked="true"或checked="false"或checked="anything"都是相同的-它们设置checked状态但是因为只能检查一个,所以最后一个是(属性应该是bool,而不是int) -
MVC Razor 中的一个重要教训是在循环通过集合创建表单元素时不要使用
foreach。始终使用例如for (var i = 0; i < Model.HotelPrices.Count; i++)然后@Html.RadioButtonFor(m => Model.HotelPrices[i], ... )。这是在提交表单时生成模型绑定可以使用的元素名称所必需的。 -
感谢@StephenMuecke 和@PeterB。使用 for 而不是 foreach 会产生积极的变化(即现在至少出现了一些东西)。我将收音机的选中部分(只是为了看看)设置为“是”
new { @checked = "true" },设置为“否”new { @checked = "false" }。现在所有值都显示为“否”,而它们必须显示为“是”。 @StephenMuecke 我不明白我应该如何更正检查的部分。我也无法理解你所说的“最后一个是(并且属性应该是 bool,而不是 int)”是什么意思。如果您能重新解释一下,我将不胜感激。 -
你需要删除
new { @checked = "..." } -
因为
RadioButtonFor()方法设置正确 - 它的属性值为1第一个将被检查。如果是0,那么第二个将是 - 这就是模型绑定的工作方式 - 它绑定到您的属性的值
标签: html asp.net-mvc razor radio-button