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

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

问题描述

我下面这个例子

<一个href=\"http://www.andrewdenhertog.com/c/asp-net-mvc-binding-a-list-of-values-to-a-list-of-checkboxes/\"相对=nofollow>在这里输入链接的描述

但是,当我提出,它说不能转换'假'到'廉政'

我认为其或真或假,这是获得通过,而不是实际值

我在做什么错了?

我的模型

 公开的IEnumerable&LT; AllocateRequirementViewModel&GT;要求{搞定;组; }  公开名单&LT; INT&GT; RequirementIds {搞定;组; }

然后我的剃须刀

 &LT; D​​IV ID =RequirementsContainer&GT;
            @foreach(在Model.Requirements VAR要求)
            {
                &LT; D​​IV CLASS =行&GT;
                    &LT;输入ID =@ requirement.Id类型=复选框NAME =RequirementIdsVALUE =@ requirement.Id/&GT; @ requirement.Description
                &LT; / DIV&GT;
            }
        &LT; / DIV&GT;


解决方案

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

 公共类TestViewModel
{
    公众的Guid标识{搞定;组; }
    公众的IDictionary&LT;的Guid,字符串&GT; AllCheckboxOptions {搞定;组; }
    公众的Guid [] {checkedOptions就搞定;组; }
}

我用的GUID作为的PK在我的数据库,所以这些都是标识从数据库

然后,我创建了一些扩展方法生成HTML

 公共静态MvcHtmlString的CheckBoxList(此的HtmlHelper的HtmlHelper,字符串名称,列表与LT; SelectListItem&GT;列表信息,
        IDictionary的&LT;弦乐,对象&gt; htmlAttributes,的Int32列)
    {
        如果(String.IsNullOrEmpty(名))
            抛出新的ArgumentException(参数必须有一​​个值,名称);
        如果(列表信息== NULL)
            抛出新的ArgumentNullException(列表信息);
        如果(!listInfo.Any())
            返回新MvcHtmlString(的String.Empty);
        //抛出新的ArgumentException(以下简称名单必须至少包含一个值,列表信息);
        VAR outerSb =新的StringBuilder();        对于(的Int32我= 0; I&LT;列;我++)
        {
            VAR listBuilder =新TagBuilder(UL);
            如果(列→1)
                listBuilder.MergeAttribute(类,列);            VAR innerSb =新的StringBuilder();            VAR取= listInfo.Count%列== 0
                ? listInfo.Count /列
                :(listInfo.Count /列)+ 1;            VAR项目= listInfo.Skip(我*承担)。取(取);            的foreach(在项目VAR信息)
            {
                VAR inputBuilder =新TagBuilder(输入);
                如果(info.Selected)inputBuilder.MergeAttribute(选中,检查);
                //inputBuilder.MergeAttributes<string,对象&gt;(htmlAttributes);
                inputBuilder.MergeAttribute(类型,复选框);
                inputBuilder.MergeAttribute(价值,info.Value);
                inputBuilder.MergeAttribute(ID,info.Value);
                inputBuilder.MergeAttribute(名,info.Value);                VAR labelBuilder =新TagBuilder(标签);
                labelBuilder.MergeAttribute(为@ info.Value);
                labelBuilder.InnerHtml = info.Text;                // VAR包装=新TagBuilder(分区);
                //wrapper.AddCssClass(\"editor-field);
                //wrapper.InnerHtml = inputBuilder.ToString(TagRenderMode.SelfClosing)+ labelBuilder.ToString(TagRenderMode.Normal);                VAR listItemWrapper =新TagBuilder(「李先生」);
                //可能要带code在这里。
                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));
        }        返回新MvcHtmlString(outerSb.ToString());
    }

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

  @ Html.CheckBoxList(yourtypes(从o在Model.AllCheckboxOptions
                                        选择新SelectListItem
                                        {
                                            文= o.Value,
                                            选择= 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);
        //throw new ArgumentException("The list must contain at least one value", "listInfo");
        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.MergeAttributes<string, object>(htmlAttributes);
                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 wrapper = new TagBuilder("div");
                //wrapper.AddCssClass("editor-field");
                //wrapper.InnerHtml = inputBuilder.ToString(TagRenderMode.SelfClosing) + labelBuilder.ToString(TagRenderMode.Normal);

                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天全站免登陆