我正在使用ASP.NET,MVC,Razor中的RadioButton组,并尝试根据之前选择的选项动态设置无线电组上的所选按钮。以下是相关的代码段:
List<Product> productList = ViewBag.ProductList;
if (productList != null && productList.Count > 0)
{
foreach (Product product in productList)
{
<tr>
<td>
@Html.RadioButtonFor(p => p.ProductIdString, productList[i].Id, new { Checked = @ViewBag.ProductSelected==product.Id ? true: false, onclick="this.form.submit();", tabindex = @tab })
@{tab++;}
@{i++;}
<td>@product.Name</td>
<td>@product.Description</td>
<td>@product.FormattedPrice</td>
</tr>
}
}
在第一次发布页面时,一切都按预期工作。保存的productId正确设置了该选项。但是,如果在初始加载后选择了新选项,则所选按钮Checked and checked属性和属性将如图所示正确设置,但之前选择的按钮将在表单上标记为已选中:
<td>
<input Checked="True" checked="checked" data-val="true" data-val-required="Please select a product" id="ProductIdString" name="ProductIdString" onclick="this.form.submit();" tabindex="30" type="radio" value="1" />
</td>
我已阅读了不少帖子,说明Checked / checked属性/属性是默认选择,一旦设置,它似乎无法更改?它是否正确?如果没有,您如何动态设置所选的单选按钮?
只需一个注释,当表单提交给控制器时,Request对象具有正确选择的值,但它不会显示为已选择。
我在这里感到茫然,并希望得到任何建议。
答案 0 :(得分:0)
我首先要说的是,他在View上的逻辑应首先在Controller中解析,并准备好在将其传递给Viewbag或模型中的View时显示。
要更改收音机的价值,您需要一些javascript或更简单的jQuery。看看这个arcticles:
答案 1 :(得分:0)
您的代码存在的问题是它没有以正确的方式处理html属性“已检查”。
checked属性是布尔属性!如果属性存在,无论其内容是什么(true,false,checked,foobar),都会检查radiobutton。
因为在Razor元素中使用可选的html属性非常困难,所以我使用技巧:
@Html.RadioButtonFor(p => p.ProductIdString, productList[i].Id,
Dictionary<string, object>() {
{"checked" + (@ViewBag.ProductSelected==product.Id ? "": "not"), ""},
{"onclick", "this.form.submit();"},
{"tabindex", @tab}
})
这样,无线电按钮元素在未被选中时具有checkednot
属性,而checked
属性为CollectionName
。浏览器只是忽略了checkednot属性,而只检查了一个元素。