[英]Generating a list of RadioButtons with the same name in a for-loop in an ASP.NET MVC3 view
我正在开发一个ASP.NET MVC3项目,并且PartialView中的for
循环生成的RadioButtons名称存在问题。
首先,这是我的代码,下面将解释确切的问题:
模型FileUploadModel
public class FileUploadModel
{
public HttpPostedFileBase File { get; set; }
public bool IsMainFile { get; set; }
}
模特MyModel
public class MyModel
{
// Some properties
public List<FileUploadModel> Files { get; set; }
}
如何调用PartialView _UploadFiles
@Html.Partial("_UploadFiles", Model) // Model is a MyModel model
PartialView _UploadFiles-这里是问题
@model MyModel
@{
var nbFiles = (Model.Files != null ? Model.Files.Count : 0);
const int NB_DEFAULT_UPLOAD_FIELDS = 3;
}
@for (int i = 0; i < NB_DEFAULT_UPLOAD_FIELDS; i++)
{
@Html.TextBoxFor(m => m.Files[nbFiles].File, new { type = "file", name = "Files", id = "Files" })
@Html.RadioButtonFor(m => m.Files[nbFiles].IsMainFile, "Main ?", new { id = "rb" + i + "_File_IsMain" })
}
因此,这是问题的最后片段。 我想用关联的RadioButton创建3个上传字段,以指示文件是否为“主文件”。 但是,使用上面的代码片段,显示的视图就可以了,但是当我验证表单时,我发布的模型仅上传了第一张图片(以及相应的布尔值IsMainFile
,其余的则被忽略了)。 这意味着列表Files
仅包含第一个TextBox和第一个RadioButton数据
因此,我尝试使用@Html.RadioButtonFor(m => m.Files[i].IsMainFile
,但是RadioButton的名称不同,因此用户可以检查所有RadioButton,这不是理想的行为@Html.RadioButtonFor(m => m.Files[i].IsMainFile
没有授权我覆盖RadioButtons的name
,所以我不能给他们自己的名字。
我如何生成这些字段,以便仅可以检查一个MyModel.Files
属性包含所有选择的文件?
谢谢
我认为您最好的选择是使用编辑器模板 。
首先,创建一个名为FileUploadModel
的视图,并将其放置在一个名为EditorTemplates
的文件夹中,该文件夹应位于控制器的Views
文件夹下。 请注意,视图的名称必须与视图模型的类的名称匹配。
其内容如下所示:
@model FileUploadModel
@Html.TextBoxFor(m => m.File, new { type = "file" })
@Html.RadioButtonFor(m => m.IsMainFile, true)
然后,回到"_UploadFiles"
视图,输入字段和单选按钮的标记将更改为:
@model MyModel
using (Html.BeginForm(...
@Html.EditorFor(m => m.Files)
...
请注意,这将自动迭代并为每个FileUploadModel
对象应用该编辑器模板,并根据需要自动为其命名。 当然,这假定已填充模型中的Files
属性。
您接受帖子的操作应接受MyModel
类型作为其唯一参数,并且所有内容都应在发布时自动绑定。
有一些方法可以避免使用编辑器模板, 并以编程方式构建和命名这些字段 ,但这确实是首选方法,而且更加简洁。
更具体地针对您的问题... (换句话说,我忘记了上面的代码不会对单选按钮进行分组。)
为了使单选按钮分组有效,应按如下所示设置属性名称:
@Html.RadioButtonFor(m => m.IsMainFile, true, new { Name = "IsMainFile" })
案例很重要。 请注意, Name
必须大写才能生效。 我不确定为什么会这样。
问题在于,一旦更改了该属性,该字段将不再自动绑定到帖子中。 不幸的是,但这是设计好的,因为如果您查看请求,我相信您会看到仅发布了选定的单选按钮值。
因此,您可以将单选按钮的值更改为可识别的值,因为如果我是对的,则只是IsMainFile
一个实例将显示在请求中。
也许您可以使用此特定知识来调整现有代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.