如何复选框值绑定到整数的列表? [英] How to bind checkbox values to a list of ints?
问题描述
我下面这个例子
<一个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; DIV ID =RequirementsContainer&GT;
@foreach(在Model.Requirements VAR要求)
{
&LT; DIV 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
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屋!