我有一个名为W2_Sent的字段,定义为(bit,null)
在我看来,我有以下内容,将其显示为一个复选框:
<div class="editor-label" style="width: 10em">
@Html.Label("W2 Sent")
</div>
<div class="editor-field">
@Html.EditorFor(model => model.W2_Sent)
@Html.ValidationMessageFor(model => model.W2_Sent)
</div>
如果我检查一下,我收到错误
值'checked'对W2_Sent
无效 [HttpPost]
public ActionResult Create(Employee emp)
{
foreach (ModelState modelState in ViewData.ModelState.Values)
{
foreach (ModelError error in modelState.Errors)
{
string s = "error";
}
}
我能够在上面看到的foreach循环中捕获错误..
为什么我得到的值'已检查'无效但
答案 0 :(得分:12)
要在表单中显示复选框,您应始终使用@Html.CheckBox/CheckBoxFor
代替<input type="checkbox" name="gender" />
。当您使用@Html.CheckBox/CheckBoxFor
时,ASP.NET MVC会生成一个隐藏字段,该字段具有布尔值,并且将绑定到您的模型属性。
当你直接使用html部分时,浏览器会将字段的值发布为字符串“checked”(如果是),并且在模型绑定中会抛出错误。
答案 1 :(得分:4)
我这样做了。为CheckBoxFor编写自己的ExtensionMethod。 诀窍是复选框中“value”=“true”的静态值和隐藏字段中的“value”“false”。 如前所述,将不会发回值为false的复选框。在这种情况下,将采用隐藏字段的值。当用户选中该复选框时,新的“true”值将覆盖隐藏字段中的“false”。
public static MvcHtmlString CheckboxForMetro<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, int offset = 3)
{
TagBuilder tblabel = new TagBuilder("label");
tblabel.AddCssClass("checkbox offset" + offset.ToString());
TagBuilder tbinput = new TagBuilder("input");
tbinput.Attributes.Add("type", "checkbox");
tbinput.Attributes.Add("id", GetPropertyNameFromLambdaExpression(html, expression));
tbinput.Attributes.Add("name", GetPropertyNameFromLambdaExpression(html, expression));
tbinput.Attributes.Add("value", "true");
tbinput.MergeAttributes(GetPropertyValidationAttributes(html, expression, null));
if (GetPropertyValueFromLambdaExpression(html, expression) == "True") tbinput.Attributes.Add("checked", "checked");
TagBuilder tbhidden = new TagBuilder("input");
tbhidden.Attributes.Add("type", "hidden");
tbhidden.Attributes.Add("value", "false");
tbhidden.Attributes.Add("name", GetPropertyNameFromLambdaExpression(html, expression));
TagBuilder tbspan = new TagBuilder("span");
//tbspan.AddCssClass("span" + spanLabel.ToString());
tbspan.InnerHtml = GetPropertyDisplayNameFromLambdaExpression(html, expression);
tblabel.InnerHtml = tbinput.ToString() + tbspan.ToString() + tbhidden.ToString();
return new MvcHtmlString(tblabel.ToString());
}
的Metro UI CSS的ExtensionMethod
这是获取值,displayname,propertyname和validationAttributes
的代码 private static string GetPropertyDisplayNameFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
return metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last() ?? "Geen tekst";
}
private static string GetPropertyValueFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
string value = string.Empty;
TModel model = html.ViewData.Model;
if (model != null)
{
var expr = expression.Compile().Invoke(model);
if (expr != null)
{
value = expr.ToString();
}
}
return value;
}
private static string GetPropertyNameFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
return metadata.PropertyName;
}
private static IDictionary<string, object> GetPropertyValidationAttributes<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
IDictionary<string, object> validationAttributes = html.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);
if (htmlAttributes == null)
{
htmlAttributes = validationAttributes;
}
else
{
htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value);
}
return htmlAttributes;
}
我希望这会帮助别人。
答案 2 :(得分:0)
就我而言,我正在使用某些样式库,但不允许我使用HTMLhelper。因此,如果对任何人都有用,一个简单的解决方案就是在提交表单时使用jQuery,只需将检查值分配给输入,如下所示。
$("#myForm").submit(function (e) {
$("#myCheckBoxInput").val($("#myCheckBoxInput").prop("checked"))
})