C# 创建用于替代CheckboxFor的帮助器

C# 创建用于替代CheckboxFor的帮助器,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我正在开始一个新项目中使用Bootstrap5,我决定创建一个包装器来自动完成这项工作,而不必编写表单字段周围的所有脚手架 我对textboxfor、textareafor和dropdownlist使用了以下语法: public static MvcHtmlString MyTextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> helper, Expression<Func&l

我正在开始一个新项目中使用Bootstrap5,我决定创建一个包装器来自动完成这项工作,而不必编写表单字段周围的所有脚手架

我对textboxfor、textareafor和dropdownlist使用了以下语法:

public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TProperty>> expression)
    {
        var stringbuilder = new MvcHtmlString("<div class='form-group'>" +
                                                    helper.LabelFor(expression, new {@class = "col-sm-3 control-label"}) +
                                                    "<div class='col-sm-5'>" +
                                                        helper.TextBoxFor(expression, new {@class = "form-control"}) +
                                                    "</div>" +
                                              "</div>");

        return stringbuilder;
    }
public静态MvcHtmlString MyTextBoxFor(
这个HtmlHelper助手,
表达式(表达式)
{
var stringbuilder=new MvcHtmlString(“”)+
LabelFor(表达式,new{@class=“col-sm-3控制标签”})+
"" +
TextBoxFor(表达式,new{@class=“form control”})+
"" +
"");
返回stringbuilder;
}
可按如下方式调用:

@FormHelpers.MyTextBoxFor(Html,x=>x.Name)

但是,这似乎不适用于以下复选框:

错误1“System.Web.Mvc.HtmlHelper”不包含“CheckBoxFor”的定义和“System.Web.Mvc.Html.InputExtensions.CheckBoxFor(System.Web.Mvc.HtmlHelper,System.Linq.Expressions.Expression)”的最佳扩展方法重载“System.Web.Mvc.Html.InputExtensions.CheckBoxFor”具有一些无效参数

如果我将
TProperty
更改为
bool
,它将编译,但在我调用此帮助程序的行中出现运行时错误:

CS0411:无法从用法推断方法“CollectionSystem.Helpers.FormHelpers.MyCheckboxFor(System.Web.Mvc.HtmlHelper,System.Linq.Expressions.Expression)”的类型参数。尝试显式指定类型参数。


请有人告诉我如何包装CheckboxFor函数。

立即停止并从您的项目中删除所有这些代码

您需要的是编辑器模板。首先,在
Views\Shared\EditorTemplates
创建一个新文件夹。然后,在该文件夹中,创建以
DataType
enum的类型或成员之一命名的视图。例如:

Views\Shared\EditorTemplates\String.cshtml

<div class="form-control">
    @Html.Label("", new { @class = "col-sm-3 control-label" })
    <div class="col-sm-5">
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), new { @class = "form-control" })
    </div>
</div>
@model Boolean?
<div class="form-control">
    <div class="col-offset-sm-3 col-sm-5">
        <div class="checkbox">
            <label>
                @Html.CheckBox("", Model ?? false)
                @ViewData.ModelMetadata.GetDisplayName() 
            </label>
        </div>
    </div>
</div>
根据属性的类型或它所修饰的
数据类型
,将使用正确的编辑器模板,并且没有开发人员必须记住使用的自定义帮助程序

我在我的博客上有更深入的解释:


    • 您的助手需要像

      public static MvcHtmlString BootstrapCheckBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> 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());
      
      }
      
      public static MvcHtmlString BootstrapCheckBoxFor(此HtmlHelper,表达式)
      {
      TagBuilder innerContainer=新的TagBuilder(“div”);
      innerContainer.AddCssClass(“col-sm-5”);
      innerContainer.InnerHtml=helper.CheckBoxFor(表达式,new{@class=“form control”}).ToString();
      StringBuilder html=新的StringBuilder();
      Append(helper.LabelFor(表达式,new{@class=“col-sm-3 control label”}));
      Append(innerContainer.ToString());
      标记生成器outerContainer=新标记生成器(“div”);
      outerContainer.AddCssClass(“表单组”);
      outerContainer.InnerHtml=html.ToString();
      返回MvcHtmlString.Create(outerContainer.ToString());
      }
      

      注意:您可能希望编辑此内容以包括
      @Html.ValidationMessageFor()

      谢谢Chris。我正在看你的博客。我发现“听起来很简单。有什么问题?”第一段第三行“…这些视图的模型…”Chris Pratt在EditorTemplates中同时使用复选框和单选按钮怎么样?除非你真的想要一个用于真值和假值的单选按钮,否则收音机通常不用于
      bool
      类型。不过,如果您希望能够处理相同的类型,
      bool
      ,在本例中,无论使用哪种类型,您都需要一些方法来区分。这可以通过多种方式实现。您可以在属性上使用类似于
      [UIHint(“Radio”)]
      的内容来指定应使用
      Radio.cshtml
      编辑器模板。或者您可以将一些值传递到模板
      ViewData
      中,并在其上分支:
      Html.EditorFor(m=>m.SomeBool,new{useRadios=true})
      ,然后在
      ViewData[“useRadios”]
      上分支,这可能会有所帮助:
      public static MvcHtmlString BootstrapCheckBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> 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());
      
      }