如何将复选框值绑定到整数列表? [英] How to bind checkbox values to a list of ints?

查看:38
本文介绍了如何将复选框值绑定到整数列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注这个例子

在此处输入链接描述

但是当我提交时,它说无法将'false'转换为'int'

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

我做错了什么?

我的模型是

 public IEnumerable要求{得到;放;}公共列表RequirementIds { 获取;放;}

那么我的剃须刀是

 

@foreach(Model.Requirements 中的 var 要求){<div class="row"><input id="@requirement.Id" type="checkbox" name="RequirementIds" value="@requirement.Id"/>@requirement.Description

}

解决方案

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

公共类TestViewModel{公共 GUID { 获取;放;}公共 IDictionaryAllCheckboxOptions { 获取;放;}公共 Guid[] CheckedOptions { get;放;}}

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

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

 public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, String name, List listInfo,IDictionary<字符串,对象>htmlAttributes,Int32 列){if (String.IsNullOrEmpty(name))throw new ArgumentException("参数必须有值", "name");如果(列表信息 == 空)throw new ArgumentNullException("listInfo");如果 (!listInfo.Any())返回新的 MvcHtmlString(String.Empty);var outerSb = new StringBuilder();for (Int32 i = 0; i <列; i++){var listBuilder = new TagBuilder("ul");如果(列> 1)listBuilder.MergeAttribute("class", "column");var innerSb = new StringBuilder();var take = listInfo.Count % 列 == 0?listInfo.Count/列: (listInfo.Count/列) + 1;var items = listInfo.Skip(i * take).Take(take);foreach(项目中的var信息){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");//可能需要在这里编码.listItemWrapper.InnerHtml = inputBuilder.ToString(TagRenderMode.SelfClosing) + labelBuilder.ToString(TagRenderMode.Normal);innerSb.Append(listItemWrapper.ToString(TagRenderMode.Normal));}listBuilder.InnerHtml = innerSb.ToString();externalSb.Append(listBuilder.ToString(TagRenderMode.Normal));}返回新的 MvcHtmlString(outerSb.ToString());}

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

 @Html.CheckBoxList("yourtypes", (来自 Model.AllCheckboxOptions 中的 o选择新的 SelectListItem{文字 = o.Value,Selected = Model.CheckedOptions.Contains(o.Key),值 = o.Key.ToString()}).ToList())

我已经成功地将这种技术用于 MVC3 和 MVC4.

I am following this example

enter link description here

But when I submit, it says can't convert 'false' to 'int'

as I assume its the false or true that is getting passed, not the actual value

what am I doing wrong?

My model is

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

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

then my razor is

  <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>

解决方案

your model is going to need to contain both the checked values and all the possible values.

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

I use Guids as PKs in my database so these are the IDs from the database

I then created a number of extension methods to generate the 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());
    }

then in the view you can call your extension method

    @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())

I've used this technique with both MVC3 and MVC4 with success.

这篇关于如何将复选框值绑定到整数列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆