创建帮助程序以覆盖CheckboxFor
我在我正在开始的新项目中使用bootstrap 5,而不是必须在表单字段周围编写所有脚手架,我已经决定创建一个包装器来自动为我执行此操作。
我使用了textboxfor,textareafor和dropdownlist的以下语法:
public static MvcHtmlString MyTextBoxFor( this HtmlHelper helper, Expression<Func> expression) { var stringbuilder = new MvcHtmlString("" + helper.LabelFor(expression, new {@class = "col-sm-3 control-label"}) + "" + helper.TextBoxFor(expression, new {@class = "form-control"}) + "" + ""); return stringbuilder; }
然后可以如下调用:
@FormHelpers.MyTextBoxFor(Html, x => x.Name)
但是,这似乎不适用于checkboxfor:
Error 1 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'CheckBoxFor' and the best extension method overload 'System.Web.Mvc.Html.InputExtensions.CheckBoxFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression<System.Func>)' has some invalid arguments
如果我将TProperty
更改为bool
那么它将编译,但是我在调用此帮助程序的行上遇到运行时错误:
CS0411: The type arguments for method 'CollectionSystem.Helpers.FormHelpers.MyCheckboxFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression<System.Func>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
有人可以建议我如何包装CheckboxForfunction。
你好帮手需要像
public static MvcHtmlString BootstrapCheckBoxFor(this HtmlHelper helper, Expression> expression) { TagBuilder innerContainer = new TagBuilder("div"); innerContainer.AddCssClass("col-sm-5"); innerContainer.InnerHtml = helper.CheckBoxFor(expression, new {@class = "form-control"}).ToString(); StringBuilder html = new StringBuilder(); html.Append(helper.LabelFor(expression, new {@class = "col-sm-3 control-label"})); html.Append(innerContainer.ToString()); TagBuilder outerContainer = new TagBuilder("div"); outerContainer.AddCssClass("form-group"); outerContainer.InnerHtml = html.ToString(); return MvcHtmlString.Create(outerContainer.ToString()); }
请注意,您可能要编辑此内容以包含@Html.ValidationMessageFor()
立即停止并从项目中删除所有这些代码。
你想要的是编辑器模板。 首先,在Views\Shared\EditorTemplates
创建一个新文件夹。 然后,在该文件夹中,创建以DataType
枚举的类型或其中一个成员命名的视图。 例如:
视图\共享\ EditorTemplates \ String.cshtml
@Html.Label("", new { @class = "col-sm-3 control-label" }) @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), new { @class = "form-control" })
或者对于您的复选框方案,例如:
视图\共享\ EditorTemplates \ Boolean.cshtml
@model Boolean?
用你需要的任何其他东西冲洗并重复。 然后在您的视图中,您只需要:
@Html.EditorFor(m => m.TheProperty)
根据属性的类型或它所装饰的DataType
,将使用正确的编辑器模板,并且没有开发人员必须记住使用的自定义帮助程序。
我在这里的博客上有更深入的解释:
- 显示趣味和利润的模板和编辑器模板
- Html.EditorFor和htmlAttributes