c# - 如何将复选框值绑定(bind)到整数列表?

标签 c# .net asp.net-mvc-3 asp.net-mvc-4

我正在学习这个例子

enter link description here

但是当我提交的时候,它说不能将'false'转换为'int'

因为我假设传递的是 false 或 true,而不是实际值

我做错了什么?

我的模型是

  public IEnumerable<AllocateRequirementViewModel> Requirements { get; set; }

  public List<int> RequirementIds { get; set; }

那我的 Razor 是

  <div id="RequirementsContainer">
            @foreach (var requirement in Model.Requirements)
            {
                <div class="row">
                    <input id="@requirement.Id" type="checkbox" name="RequirementIds" value="@requirement.Id" /> @requirement.Description
                </div>
            }
        </div>

最佳答案

您的模型将需要包含选中的值和所有可能的值。

public class TestViewModel
{
    public Guid Id { get; set; }
    public IDictionary<Guid, String> AllCheckboxOptions { get; set; }
    public Guid[] CheckedOptions { get; set; }
}

我在我的数据库中使用 Guid 作为 PK,所以这些是来自数据库的 ID

然后我创建了一些扩展方法来生成 html

    public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, String name, List<SelectListItem> listInfo,
        IDictionary<String, Object> htmlAttributes, Int32 columns)
    {
        if (String.IsNullOrEmpty(name))
            throw new ArgumentException("The argument must have a value", "name");
        if (listInfo == null)
            throw new ArgumentNullException("listInfo");
        if (!listInfo.Any())
            return new MvcHtmlString(String.Empty);

        var outerSb = new StringBuilder();

        for (Int32 i = 0; i < columns; i++)
        {
            var listBuilder = new TagBuilder("ul");
            if (columns > 1)
                listBuilder.MergeAttribute("class", "column");

            var innerSb = new StringBuilder();

            var take = listInfo.Count % columns == 0
                ? listInfo.Count / columns
                : (listInfo.Count / columns) + 1;

            var items = listInfo.Skip(i * take).Take(take);

            foreach (var info in items)
            {
                var inputBuilder = new TagBuilder("input");
                if (info.Selected) inputBuilder.MergeAttribute("checked", "checked");
                inputBuilder.MergeAttribute("type", "checkbox");
                inputBuilder.MergeAttribute("value", info.Value);
                inputBuilder.MergeAttribute("id", info.Value);
                inputBuilder.MergeAttribute("name", info.Value);

                var labelBuilder = new TagBuilder("label");
                labelBuilder.MergeAttribute("for", @info.Value);
                labelBuilder.InnerHtml = info.Text;

                var listItemWrapper = new TagBuilder("li");
                //may have to encode here. 
                listItemWrapper.InnerHtml = inputBuilder.ToString(TagRenderMode.SelfClosing) + labelBuilder.ToString(TagRenderMode.Normal);

                innerSb.Append(listItemWrapper.ToString(TagRenderMode.Normal));
            }

            listBuilder.InnerHtml = innerSb.ToString();
            outerSb.Append(listBuilder.ToString(TagRenderMode.Normal));
        }

        return new MvcHtmlString(outerSb.ToString());
    }

然后在 View 中你可以调用你的扩展方法

    @Html.CheckBoxList("yourtypes", (from o in Model.AllCheckboxOptions
                                        select new SelectListItem
                                        {
                                            Text = o.Value,
                                            Selected = Model.CheckedOptions.Contains(o.Key),
                                            Value = o.Key.ToString()
                                        }).ToList())

我已成功地将此技术用于 MVC3 和 MVC4。

关于c# - 如何将复选框值绑定(bind)到整数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21841428/

相关文章:

c# - 在c#中,如何在多线程环境下迭代IEnumerable

c# - 使用 LINQ 在列表中查找项目但得到 "Value cannot be null. Parameter name: source"

c# - 在 C# 中获取特定进程的磁盘使用情况

c++ - 如何在 Visual Studio 2012 中创建 HelloWorld COM Interop

asp.net-mvc - ListBox for ArgumentNullException 参数名称 : source

c# - Polly 如何保持重试链

c# - 向 tableLayoutPanel 添加控件

c# - 从 "TimeSpan"转换为 "Long"

c# - 使用 MVC 自定义身份验证

asp.net-mvc - [问]asp.net mvc更新数据库报错