Controller不接收来自MVC 4中自定义htmlHelper的数据

时间:2015-05-26 03:09:55

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在 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));
    }

2 个答案:

答案 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

一样