C# 复选框未绑定的自定义帮助程序
使用html helper CheckBoxFor()时,可以执行以下操作: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.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
属性$(“”)之后插入(“输入.复选框”);
修复程序
正如我们在OPs注释中所讨论的,您需要在HTML助手中设置复选框的值。编写复选框HTML代码时,请编写checked=checked
部分
输入标签上的硬编码value=“true”
,是否应该设置
基于模型属性
替代解决方案
在扩展方法中这样手动创建HTML不是最佳实践,您将忽略扩展方法提供的所有功能
数据val
属性$(“”)之后插入(“输入.复选框”);
您在输入标记上的硬编码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");