【发布时间】:2020-01-14 20:35:11
【问题描述】:
我有一个这样的模型:
public class ImageFileDetail {
public HttpPostedFileBase File { get; set; }
public bool IsMainImage { get; set; }
public string SourceURL { get; set; }
}
我使用计数为 10 的 List<ImageFileDetail> 填充剃刀视图,允许用户上传 10 张图像。
IsMainImage 只能是一张图片。
我必须在@for 循环而不是@foreach 中执行此操作,否则模型绑定器不会绑定到列表中的每个单独对象。发布表单时,执行@foreach 会为它们提供相同的name=,因此我无法将其作为单独的对象进行迭代。
查看:
@for (var i = 0; i < Model.ImageFileDetails.Count(); i++)
{
<tr>
<td>
@Html.TextBoxFor(x => x.ImageFileDetails[i].File, new { type = "file" })
</td>
<td>
@Html.EditorFor(x => x.ImageFileDetails[i].SourceURL, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(x => x.ImageFileDetails[i].SourceURL, "", new { @class = "text-danger" })
</td>
<td>
@*Html.EditorFor(x => x.ImageFileDetails[i].IsMainImage)*@
// this is the radio button
@Html.RadioButton("UniqueIsMainImage", Model.ImageFileDetails[i].IsMainImage)
@Html.ValidationMessageFor(x => x.ImageFileDetails[i].IsMainImage, "", new { @class = "text-danger" })
</td>
</tr>
}
通过在@RadioButton 中为单选按钮提供相同的名称,这样我就可以只选择一个,这很好。当一个被选中时,前一个被取消选中,这是想要的结果。
问题是在POST 上,我没有得到列表中选定单选按钮的true 值,我不知道为什么。
我做错了什么?
【问题讨论】:
-
通过将单选按钮命名为“UniqueIsMainImage”,ModelBinder 不再将其与 IsMainImage 属性相关联
-
@Kei 是的,我明白了。这是我认为我可以让单选按钮作为一组单选按钮工作的唯一方法,而不是 10 个独立的单选按钮。试图找出没有 javascript 方法的正确方法。
-
另一种方法是在模型中而不是在每个 ImageFileDetail 中识别主图像。例如,您可以在您的模型上有一个 MainFileIndex 属性,您的单选按钮绑定到该属性。然后,单选按钮可以返回所选文件的索引。
-
@Kei 我现在实际上正在考虑这个想法,但我似乎无法让它发挥作用。 ://
-
@Kei 你是对的,我设法用
@Html.RadioButtonFor(x => Model.SelectedImageId, Model.ImageFileDetails[i].Id)得到它。然后在我的控制器中,我可以将bool设置为true以获得正确的Id。谢谢!
标签: asp.net-mvc for-loop razor model-binding