在ASP.NET MVC3视图的for循环中生成具有相同名称的RadioButtons列表

时间:2014-02-12 14:49:37

标签: c# asp.net asp.net-mvc-3 for-loop radio-button

我正在开发一个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属性包含所有选择的文件?

谢谢

1 个答案:

答案 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的一个实例将显示在请求中,如果我是正确的。

也许您可以使用此特定知识来调整现有代码。