2014-12-04 35 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