我正在 ASP.NET MVC4 中创建自定义HtmlHelper(checkbox)
。但是,当我提交表单时,控制器不会从该自定义控件接收数据。
我的自定义控制代码:
/* Extension Checkbox */
public static MvcHtmlString CheckBoxExtension<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string className)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
TagBuilder checkbox = new TagBuilder("input");
if (metaData.SimpleDisplayText != null)
{
if (Convert.ToBoolean(metaData.SimpleDisplayText))
{
checkbox.MergeAttribute("checked", "checked");
}
}
checkbox.MergeAttribute("id", metaData.PropertyName);
checkbox.MergeAttribute("type", "checkbox");
checkbox.MergeAttribute("class", className);
return MvcHtmlString.Create(checkbox.ToString(TagRenderMode.SelfClosing));
}
答案 0 :(得分:0)
您没有在控制器中获取复选框值,因为您尚未在复选框中添加name
属性。尝试添加名称属性,如下所示
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
string name = ExpressionHelper.GetExpressionText((LambdaExpression)expression);
checkbox.Attributes.Add("name", name);
答案 1 :(得分:0)
@Html.CheckBoxFor
将创建两个输入,一个是复选框,另一个是隐藏的。在隐藏输入中,值为false,复选框值为true。它们的名字相同。发布时,如果选中该复选框,则后置值为(true,false)。如果未选中该复选框,则post值仅为false,因此binder将该值绑定到boolean属性;如果post值为true,则bool设置为true。
所以我认为你应该为未经检查的案例添加一个隐藏的输入。就像@Html.CheckBoxFor
。