2014-12-04 50 views
1

我在启动一个新项目中使用引导程序5,而不是必须围绕表单字段编写所有脚手架,我决定创建一个包装器来自动为我执行此操作。创建一个帮助器来覆盖复选框For

我已经使用textboxfor,textareafor和下拉列表的语法如下:

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 => x.Name)

然而,这似乎并不为checkboxfor工作:

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

如果我改变TPropertybool它会再编译,但我上线运行时错误,我把这个助手:

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

可有人建议我怎么能去包裹CheckboxFor功能请。

回答

1

你帮手需要像

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

6

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

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

视图\共享\ 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> 

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

查看\共享\ 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它的装饰着,右编辑模板将被使用,开发人员必须记住没有自定义助手使用。

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

+0

谢谢克里斯。我只是在阅读你的博客。我在这个部分发现了一个错字:“听起来很简单,这是怎么回事?”,第一段,第三行,“......这些视图的模型......” – Celdor 2015-02-07 02:49:28

+0

@Chris Pratt在EditorTemplates中使用Checkboxes和Radiobuttons怎么样? – 2015-05-04 18:56:17

+0

收音机通常不用于“bool”类型,除非您真的需要收音机来播放真实值和假值。尽管如此,如果你想能够处理相同的类型,在这种情况下使用'bool',或者使用其中一种,你需要一些方法来区分。这可以通过多种方式完成。你可以在属性上使用'[UIHint(“Radio”)]''来指定应该使用'Radio.cshtml'编辑器模板。或者你可以传递一些值到'ViewData'模板中,并在该模板上分支:'Html.EditorFor(m => m.SomeBool,new {useRadios = true})',然后在'ViewData [“useRadios” – 2015-05-04 19:09:09