创建帮助程序以覆盖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