我正在使用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和Checked属性和属性将正确设置,如图所示,但之前选择的按钮将在表单上标记为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>
我读过不少帖子,其中指出选中/选中的属性/属性是用于默认选择的,一旦设置,似乎就无法更改?这是正确的吗?如果没有,如何动态设置所选单选按钮?
只需注意一点,当表单提交到控制器时,Request对象具有正确选择的值,但它不会显示为已选择。
我在这里不知所措,如果有任何建议,我将不胜感激。
我首先要说的是,您在View上的逻辑应该首先在Controller中解析,并在您将其传递给viewbag或模型中的View时准备好显示。
要更改radio的值,您需要一些javascript或使其更简单的jQuery。看看这个弧形:
https://api.jquery.com/change/
https://learn.jquery.com/using-jquery-core/faq/how-do-i-check-uncheck-a-checkbox-input-or-radio-button/
代码的问题在于它没有以正确的方式处理html属性"checked"。
选中的属性是布尔属性!如果属性存在,不管它的内容是什么(true、false、checked、foobar),那么单选按钮都会被选中。
因为在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
属性。浏览器只是忽略checkednot属性,并且只检查一个元素。