我已经在HtmlHelper上构建了一个CheckBoxListFor扩展,这要归功于这个美妙的答案http://bit.ly/Aevcea(代码如下),但是我发现它不按预期发布。MVC CheckBoxListFor不按预期发布
我的表单基于一个模型组,其中包含(其他属性)string Name和int [] PersonIDs。
的CheckBoxListFor呈现这样的事情:
<ul>
<li><input type="checkbox" name="PersonIDs" value="1" id="PersonIDs_1" /></li>
<li><input type="checkbox" name="PersonIDs" value="2" id="PersonIDs_2" /></li>
</ul>
我的控制有一个编辑(组群)的方法来处理提交此表。但是,提交后,我发现group.PersonIDs为空。虽然有一个Request.Form [“PersonIDs”]设置为选定的值(例如,如果同时选中上述两项,则为“1,2”)。另外,如果我添加另一个参数到我的编辑方法(int [] PersonIDs),那么到达与预期的内容(选定的ID)。
任何人都可以解释我做错了什么?我的观点的相关位看起来像这样(去掉了多余位):
@Html.TextBoxFor(m => m.Group.Name)
@Html.CheckBoxListFor(m => m.Group.PersonIDs, Model.MultiSelectListOfAllPeople)
注意,在我的编辑方法组参数不回来与名称根据形式设置。
只是为了完整性,这里是我的CheckBoxListFor延长的全身:
public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, IEnumerable<TProperty>>> expression, MultiSelectList multiSelectList, object htmlAttributes = null)
{
//Derive property name for checkbox name
MemberExpression body = expression.Body as MemberExpression;
string propertyName = body.Member.Name;
//Get currently select values from the ViewData model
IEnumerable<TProperty> list = expression.Compile().Invoke(htmlHelper.ViewData.Model);
//Convert selected value list to a List<string> for easy manipulation
List<string> selectedValues = new List<string>();
if (list != null)
{
selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i) { return i.ToString(); });
}
//Create div
TagBuilder wrapper = new TagBuilder("ul");
wrapper.AddCssClass("clearfix");
wrapper.MergeAttributes(new RouteValueDictionary(htmlAttributes), true);
//Add checkboxes
foreach (SelectListItem item in multiSelectList)
{
wrapper.InnerHtml += String.Format("<li><input type=\"checkbox\" name=\"{0}\" id=\"{0}_{1}\" " +
"value=\"{1}\" {2} /><label for=\"{0}_{1}\">{3}</label></li>",
propertyName,
item.Value,
selectedValues.Contains(item.Value) ? "checked=\"checked\"" : "",
item.Text);
}
return MvcHtmlString.Create(wrapper.ToString());
}
感谢@nativehr - 我真的不能标记这个作为回答,但它确实有用的信息。 – getsetcode 2013-05-10 08:41:32