Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复选框未绑定的自定义帮助程序_C#_Asp.net Mvc_Html Helper - Fatal编程技术网

C# 复选框未绑定的自定义帮助程序

C# 复选框未绑定的自定义帮助程序,c#,asp.net-mvc,html-helper,C#,Asp.net Mvc,Html Helper,使用html helper CheckBoxFor()时,可以执行以下操作: @Html.CheckBoxFor(model => model.active) 这将产生如下html代码: <input class="check-box" id="active" name="active" type="checkbox" value="true" /> <input name="active" type="hidden" value="false" />

使用html helper CheckBoxFor()时,可以执行以下操作:

@Html.CheckBoxFor(model => model.active)
这将产生如下html代码:

    <input class="check-box" id="active" name="active" type="checkbox" value="true" />
<input name="active" type="hidden"  value="false" />
public static MvcHtmlString CustomCheckboxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
{
    var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    string propertyName = data.PropertyName;
    string s = "";
    s += "<input class=\"check-box\" id=\"" + propertyName + "\" name=\"" + propertyName+ "\" type=\"checkbox\" value=\"true\" />";
    s += "<i class=\"no-rounded\"></i>";
    s += "<input name=\"" + propertyName + "\" type=\"hidden\"  value=\"false\" />";
    return MvcHtmlString.Create(s.ToString());
这是绘制复选框ok,css/jquery效果正在工作, 但是例如,在创建或编辑视图时,它没有绑定到模型上的属性(如果属性为true,则应在加载表单时选中复选框,但它没有)

我该怎么做

更新: 好吧,我取得了一些进步,现在它正在发挥作用,但我打赌一定有更好、更优雅的方法来做这件事。。。我所做的是让.net助手为复选框和隐藏字段生成html代码。然后我得到了这个字符串,并在两个字段之间插入了所需的标记,然后返回:

    public static MvcHtmlString UnifyCheckboxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
            {
                string s = helper.CheckBoxFor(expression).ToString();
                string part1 = s.Substring(0,s.IndexOf(">")+1);
                string part2 = s.Substring(s.IndexOf(">")+1);
                string str = part1 + "<i class=\"no-rounded\"></i>" + part2;
                return MvcHtmlString.Create(str.ToString());
   }
public static MvcHtmlString UnifyCheckboxFor(此HtmlHelper,表达式)
{
字符串s=helper.CheckBoxFor(表达式).ToString();
字符串part1=s.Substring(0,s.IndexOf(“>”)+1);
字符串part2=s.Substring(s.IndexOf(“>”)+1);
字符串str=part1+“”+part2;
返回MvcHtmlString.Create(str.ToString());
}
UPDATE2:根据@Joshua Duxbury在评论中给出的信息:如果创建自定义帮助程序,框架不会尝试绑定它,因此我们必须自己对帮助程序进行绑定。因此,初始代码只需添加该逻辑即可工作:

    public static MvcHtmlString CustomCheckboxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
    {
        var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        string propertyName = data.PropertyName;
        string s = "";
        s += "<input class=\"check-box\" id=\"" + propertyName + "\" name=\"" + propertyName+ "\" type=\"checkbox\" value=\"true\" " + ((data.Model.Equals(true)) ? "checked=\"checked\"" : "") +"/>";
        s += "<i class=\"no-rounded\"></i>";
        s += "<input name=\"" + propertyName + "\" type=\"hidden\"  value=\"false\" />";
        return MvcHtmlString.Create(s.ToString());
}
public static MvcHtmlString CustomCheckboxFor(此HtmlHelper,表达式)
{
var data=ModelMetadata.FromLambdaExpression(表达式,helper.ViewData);
字符串propertyName=data.propertyName;
字符串s=“”;
s+=”;
s+=”;
s+=”;
返回MvcHtmlString.Create(s.ToString());
}

修复程序

正如我们在OPs注释中所讨论的,您需要在HTML助手中设置复选框的值。编写复选框HTML代码时,请编写
checked=checked
部分

输入标签上的硬编码
value=“true”
,是否应该设置 基于模型属性

替代解决方案

在扩展方法中这样手动创建HTML不是最佳实践,您将忽略扩展方法提供的所有功能

  • 不正确的双向模型绑定
  • 模型状态验证
  • 不呈现
    数据val
    属性
  • 因此,如果您只需要在HTML标记后插入一些HTML,那么您可以使用脚本语言在客户端执行此操作。下面的示例是用jQuery编写的

    jQuery示例

    $(“”)之后插入(“输入.复选框”);
    
    修复程序

    正如我们在OPs注释中所讨论的,您需要在HTML助手中设置复选框的值。编写复选框HTML代码时,请编写
    checked=checked
    部分

    输入标签上的硬编码
    value=“true”
    ,是否应该设置 基于模型属性

    替代解决方案

    在扩展方法中这样手动创建HTML不是最佳实践,您将忽略扩展方法提供的所有功能

  • 不正确的双向模型绑定
  • 模型状态验证
  • 不呈现
    数据val
    属性
  • 因此,如果您只需要在HTML标记后插入一些HTML,那么您可以使用脚本语言在客户端执行此操作。下面的示例是用jQuery编写的

    jQuery示例

    $(“”)之后插入(“输入.复选框”);
    
    您在输入标记上的硬编码
    value=“true”
    是否应该根据模型属性设置?如果我理解了.net mvc中复选框的工作原理(我可能是错的),复选框的值应该始终为true,而隐藏的值应该始终为false。。。(这是因为如果选中html复选框,则只有在提交表单时才会将其发送回服务器)。这样,当复选框未选中时,隐藏字段仍将发送回服务器,值为false…是的,我认为只要使复选框的名称与属性的名称相同,.net就可以绑定它们。。。但是情况似乎并非如此,lol。不,如果您制作了自定义HTML帮助程序,它不会基于名称绑定复选框的值。您需要设置值。@Joshua Duxbury好的,这似乎是正确的答案。。。现在,我正在检查该属性在模型中是否为true,如果为true,则在编写checkbox html代码时编写“checked=checked”部分。谢谢你,伙计。你在输入标签上的硬编码
    value=“true”
    ,不应该根据模型属性设置吗?如果我理解了复选框在.net mvc中的工作原理(我可能是错的),复选框的值应该总是true,而隐藏的值应该总是false。。。(这是因为如果选中html复选框,则只有在提交表单时才会将其发送回服务器)。这样,当复选框未选中时,隐藏字段仍将发送回服务器,值为false…是的,我认为只要使复选框的名称与属性的名称相同,.net就可以绑定它们。。。但是情况似乎并非如此,lol。不,如果您制作了自定义HTML帮助程序,它不会基于名称绑定复选框的值。您需要设置值。@Joshua Duxbury好的,这似乎是正确的答案。。。现在,我正在检查该属性在模型中是否为true,如果为true,则在编写checkbox html代码时编写“checked=checked”部分。感谢mate.OP已经为复选框(
    value=“true”
    )和隐藏输入(value=“false”
    )正确设置了值。不,它不是基于模型属性设置的(它是需要基于属性值设置的
    checked`属性),OP已经设置为ti
        public static MvcHtmlString UnifyCheckboxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
                {
                    string s = helper.CheckBoxFor(expression).ToString();
                    string part1 = s.Substring(0,s.IndexOf(">")+1);
                    string part2 = s.Substring(s.IndexOf(">")+1);
                    string str = part1 + "<i class=\"no-rounded\"></i>" + part2;
                    return MvcHtmlString.Create(str.ToString());
       }
    
        public static MvcHtmlString CustomCheckboxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
        {
            var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
            string propertyName = data.PropertyName;
            string s = "";
            s += "<input class=\"check-box\" id=\"" + propertyName + "\" name=\"" + propertyName+ "\" type=\"checkbox\" value=\"true\" " + ((data.Model.Equals(true)) ? "checked=\"checked\"" : "") +"/>";
            s += "<i class=\"no-rounded\"></i>";
            s += "<input name=\"" + propertyName + "\" type=\"hidden\"  value=\"false\" />";
            return MvcHtmlString.Create(s.ToString());
    }
    
     $("<i class=\"no-rounded\"></i>").insertAfter("input .check-box");