繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM