如果我的表单中有Checkbox代码并且已提交给Controller,则只会发送FIRST复选框值,并忽略所有其他选中的值。
表单的示例块:
<text>
<text> text1 </text>
<text> text2 </text>
</text>
提交给Controller后:
我对此完全感到困惑。表单复选框周围是否需要额外的代码才能将值组合在一起?在ColdFusion中,发回的表单值是已检查值的完整字符串。表单控件的“名称”都是相同的(commPref),因此这应该是此字段的结果值。
修改:这是型号说明:
@:<input type="checkbox" name="commPref" value="23" />Home Phone
@:<input type="checkbox" name="commPref" value="24" />Cell Phone
@:<input type="checkbox" name="commPref" value="Work" />Work Phone
@:<input type="checkbox" name="commPref" value="26" />Email
@:<input type="checkbox" name="commPref" value="27" />Mail
答案 0 :(得分:0)
感谢这篇文章中所有评论者的帮助,最终解决了我的情况:
控制器:
[HttpPost]
public ActionResult form(form_Data form_data, IEnumerable<string> commPref)
{
if (ModelState.IsValid) // Perform DB Actions
{
// Checkbox Object Loop - commPref field
// Loop through each string array element of form field to build resulting field value
if (form_data.commPref != null)
{
//Code to make comma-delimited list of Checkbox choices
//form_data.commPref = string.Join(",", commPref);
//Wraps each Checkbox choice in pipes (|) to strictly define choice for display on form
form_data.commPref = "|";
foreach (var item in commPref)
{
form_data.commPref += item;
form_data.commPref += "|";
}
}
if (form_data.dataID != 0) // Edit Record
{
db.Entry(form_data).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index", new { msg = 2 });
}
else // Create Record
{
db.formapp_Data.Add(form_data);
db.SaveChanges();
return RedirectToAction("Index", new { msg = 1 });
}
}
else // Show Errors
{
var errors = ModelState.Values.SelectMany(v => v.Errors);
return View();
}
}
答案 1 :(得分:0)
我知道这一定是疯狂的迟到但只是让其他人发现自己在这里..
MVC确实有办法处理复选框组。
在您的视图模型中:
[显示(姓名=&#34;接受哪些信用卡:&#34;)]
public string [] EmployeeRoles {get;组; }
在您的页面上:
<input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Supervisor"
@(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Supervisor") ? "checked=true" : string.Empty)/>
<span>Supervisor</span><br />
<input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Auditor"
@(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Auditor") ? "checked=true" : string.Empty)/>
<span>Auditor</span><br />
<input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Administrator"
@(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Administrator") ? "checked=true" : string.Empty) />
<span>Administrator</span>
我非常努力地用剃刀创建这些控件,但没有骰子。它使 创建你所提到的那个隐藏的领域。为您的复选框组 你不需要那个隐藏的领域,只需要我上面添加的代码。您可以创建一个html帮助程序来为您创建此代码。
public static HtmlString CheckboxGroup<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> propertySelector, Type EnumType)
{
var groupName = GetPropertyName(propertySelector);
var modelValues = ModelMetadata.FromLambdaExpression(propertySelector, htmlHelper.ViewData).Model;//propertySelector.Compile().Invoke(htmlHelper.ViewData.Model);
StringBuilder literal = new StringBuilder();
foreach (var value in Enum.GetValues(EnumType))
{
var svalue = value.ToString();
var builder = new TagBuilder("input");
builder.GenerateId(groupName);
builder.Attributes.Add("type", "checkbox");
builder.Attributes.Add("name", groupName);
builder.Attributes.Add("value", svalue);
var contextValues = HttpContext.Current.Request.Form.GetValues(groupName);
if ((contextValues != null && contextValues.Contains(svalue)) || (modelValues != null && modelValues.ToString().Contains(svalue)))
{
builder.Attributes.Add("checked", null);
}
literal.Append(String.Format("</br>{1} <span>{0}</span>", svalue.Replace('_', ' '),builder.ToString(TagRenderMode.Normal)));
}
return (HtmlString)htmlHelper.Raw(literal.ToString());
}
private static string GetPropertyName<T, TProperty>(Expression<Func<T, TProperty>> propertySelector)
{
var body = propertySelector.Body.ToString();
var firstIndex = body.IndexOf('.') + 1;
return body.Substring(firstIndex);
}
在您的页面上使用它如下: @ Html.CheckboxGroup(m =&gt; m.EmployeeRoles,typeof(Enums.EmployeeRoles))
我使用枚举但您可以使用任何类型的集合