首页 > 解决方案 > 从复选框集合中返回一串选定值

问题描述

我正在构建一个 C# MVC 视图,其中包含一个带有一系列 4 个复选框的字段。我可以用值填充列表并很好地返回单个值,因此表单的基础知识似乎可以工作。以下是选项在视图中的填充方式:

@for (int i = 0; i < Model.QuesOptions.Count; i++)
{
    <div>
        @Html.HiddenFor(x => x.QuesOptions[i].Name)
        @Html.CheckBoxFor(x => x.QuesOptions[i].Checked)
        @Html.LabelFor(x => x.QuesOptions[i].Checked, Model.QuesOptions[i].Name)
    </div>
}

最终目标是返回发布时检查的每个项目的值的单个值列表(理想情况下以逗号分隔)。因此,当用户在表单上单击“提交”时,如果视图模型上的单个字段(称为“UserAnswer”)将填充逗号分隔的字符串,那就太好了。这甚至可能在视图模型上吗?

我有希望,可能是空的,希望这种变化会起作用:

@Html.HiddenFor(model => model.Ques.UserAnswer, 
    new { Value = Model.QuesOptions.Where(x=>x.Checked).Select(x=>x.Name) })

或者这会是某种扩展方法或 HTML 助手的工作吗?

标签: c#model-view-controllercheckboxview

解决方案


找不到在 Razor 本身中处理逗号分隔字符串的方法(可能存在一种方法,但我还没有找到),我转而选择了 JavaScript。以下代码将逗号分隔的列表插入到视图模型的隐藏字段中:

    function submitForm() {
    var question2 = "";
    for (i = 0; i <= 3; i++) {
        var trueOrNo = document.getElementById('Quez2Options_' + i + '__Checked').checked;
        if (trueOrNo) {
            question2 += document.querySelector('label[for="Quez2Options_' + i + '__Checked"]').innerHTML + ",";
        }
    }
    document.getElementById('Quez2_UserAnswer').value = question2.substring(0, question2.length - 1);

    var val3a = document.getElementById('Quez3a').value;
    var val3b = document.getElementById('Quez3b').value;
    var val3c = document.getElementById('Quez3c').value;
    var question3 = val3a + "," + val3b + "," + val3c;
    document.getElementById('Quez3_UserAnswer').value = question3;
}

推荐阅读