我正在开发一个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
,但RadioButtons有一个不同的名称,因此用户可以检查所有RadioButtons,这不是所需的行为。 MVC没有授权我覆盖RadioButtons的name
,所以我不能给他们自己的名字。
如何生成这些字段是为了只检查一个Radiobutton并且我的MyModel.Files
属性包含所有选择的文件?
谢谢
答案 0 :(得分:1)
我认为你最好的选择是使用editor templates。
首先,创建一个名为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
类型作为其唯一参数,并且所有内容都应在发布时自动绑定。
有一些方法可以避免编辑器模板和build and name those fields programmatically,但这确实是首选方式,而且更加清晰。
更具针对您的问题... (换句话说,我忘了上面的代码不会对单选按钮进行分组。)
要将单选按钮分组起作用,您应该按如下方式设置属性名称:
@Html.RadioButtonFor(m => m.IsMainFile, true, new { Name = "IsMainFile" })
案例在这里很重要。请注意Name
必须大写才能实现此目的。我不确定为什么会这样。
问题是,一旦你更改了该属性,该字段将不再自动绑定在帖子中。这是不幸的,但可以理解的是设计,因为,如果你看看请求,我相信您将看到只发布了所选的单选按钮值。
因此,您可以将单选按钮的值更改为可识别的值,因为只有IsMainFile
的一个实例将显示在请求中,如果我是正确的。
也许您可以使用此特定知识来调整现有代码。