【问题标题】:Creating A Helper To Override CheckboxFor创建一个 Helper 来覆盖 CheckboxFor
【发布时间】:2014-12-04 20:34:48
【问题描述】:

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

我对 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;
    }

然后可以如下调用:

@FormHelpers.MyTextBoxFor(Html, x =&gt; x.Name)

但是这似乎不适用于 checkbox:

Error 1 'System.Web.Mvc.HtmlHelper&lt;TModel&gt;' does not contain a definition for 'CheckBoxFor' and the best extension method overload 'System.Web.Mvc.Html.InputExtensions.CheckBoxFor&lt;TModel&gt;(System.Web.Mvc.HtmlHelper&lt;TModel&gt;, System.Linq.Expressions.Expression&lt;System.Func&lt;TModel,bool&gt;&gt;)' has some invalid arguments

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

CS0411: The type arguments for method 'CollectionSystem.Helpers.FormHelpers.MyCheckboxFor&lt;TModel,TProperty&gt;(System.Web.Mvc.HtmlHelper&lt;TModel&gt;, System.Linq.Expressions.Expression&lt;System.Func&lt;TModel,bool&gt;&gt;)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

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

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

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

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

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>

或者对于您的复选框场景,例如:

Views\Shared\EditorTemplates\Boolean.cshtml

@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>

冲洗并重复您需要的任何其他内容。那么在你看来,你只需要这样做:

@Html.EditorFor(m => m.TheProperty)

并且根据属性的类型或DataType 的装饰,将使用正确的编辑器模板,并且开发人员无需记住要使用的自定义助手。

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

【讨论】:

  • 谢谢克里斯。我只是在读你的博客。我在该部分中发现了错字:“听起来很简单。有什么问题?”,第一段,第三行,“......这些视图的模型......”
  • @Chris Pratt 将复选框和单选按钮与 EditorTemplates 一起使用怎么样?
  • 无线电通常不用于bool 类型,除非您确实想要一个无线电同时用于真值和假值。尽管如此,如果您希望能够处理相同的类型,在这种情况下为bool,无论是哪一种,您都需要一些方法来区分。这可以通过多种方式完成。您可以在您的属性上使用[UIHint("Radio")] 之类的东西来指定应该使用Radio.cshtml 编辑器模板。或者您可以将一些值传递到模板ViewData 并在其上分支:Html.EditorFor(m =&gt; m.SomeBool, new { useRadios = true }),然后在 ViewData["useRadios"] 上分支
【解决方案2】:

你的助手需要像

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());

}

请注意,您可能需要对其进行编辑以包含 @Html.ValidationMessageFor()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 2015-03-12
    • 2020-02-05
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多