2015-04-02 66 views
3

我試圖創建一個幫助,這將使我的表單控件在整個網站ASP.NET MVC @ Html.LabelFor(型號=> model.Name)助手

以下是我使用至今

@helper editorField(System.Linq.Expressions.Expression<Func<Model, String>> o) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(o, new { @class = "col-md-4 control-label" }) 
     @Html.ValidationMessageFor(o, "", new { @class = "col-md-6 col-xs-12 text-errer" }) 
     <div class="col-md-5"> 
      @Html.TextBoxFor(o, new { @class = "form-control" }) 
     </div> 
    </div> 
} 

我用它的方式是

 @editorField(model => model.Name) 
     @editorField(model => model.Email) 
     @editorField(model => model.PhoneNumber) 

這使得它很容易改變整個網站的風格和佈局在1個地方

現在,這裏是我需要幫手每個模型和數據類型

林尋找一種方式,使其工作是這樣的

@helper editorField(object o) 
{ 
     <div class="form-group"> 
      @Html.LabelFor(o, new { @class = "col-md-4 control-label" }) 
      @Html.ValidationMessageFor(o, "", new { @class = "col-md-6 col-xs-12 text-errer" }) 
      <div class="col-md-5"> 
       @Html.TextBoxFor(o, new { @class = "form-control" }) 
      </div> 
     </div> 
} 

問題

,它應該工作所有模型和數據類型

+2

看看這個:http://stackoverflow.com/questions/15968305/html-labelfor-use-displayname-of-object-not-property – 2015-04-02 18:07:21

+2

這是我對這個問題的想法:這樣的事情會是最好在單獨的代碼文件中定義爲Html助手擴展(或一組擴展)。你必須爲你想要允許的每種類型實現這一點,否則你將不得不採取一個對象,找出它的類型並投射它。我只是爲每種類型實現它。除了'int'和'string',你還需要什麼? – Nick 2015-04-02 18:45:12

+0

我需要int,字符串,十進制和雙精度 – CMS 2015-04-02 18:52:43

回答

0

所以基本上你試圖實現的是一個通用的HTML幫助器。不幸的是,這些不直接支持Razor視圖。但是,你可以使用此解決方法:

@functions 
{ 
    public HelperResult PasteEditorFor<TModel, TItem>(HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr) 
    { 
     return editorField(
      html.LabelFor(expr, new { @class = "col-md-4 control-label" }), 
      html.ValidationMessageFor(expr, "", new { @class = "col-md-6 col-xs-12 text-errer" }), 
      html.TextBoxFor(expr, new { @class = "form-control" })); 
    } 
} 

@helper editorField(MvcHtmlString label, MvcHtmlString validationMessage, MvcHtmlString textBox) 
{ 
    <div class="form-group"> 
     @label 
     @validationMessage 
     <div class="col-md-5"> 
      @textBox 
     </div> 
    </div> 
} 

// usage sample 
@PasteEditorFor(Html, m => m.LongDescription) 

但由於它仍然是不容易的可重複使用(不能在此刻如何使其可見,雖然所有的意見告訴),所以我會建議你寫平常的HtmlHelper使用通常的靜態類語法(查看Alundra the dreamwalker評論)並將其名稱空間添加到WebConfig中默認的名稱空間中。

+0

,使其對所有視圖都可見,我將它放在myHelpers.cshtml文件的app_code文件夾中,然後將其稱爲myHelpers.editorField(.. ) – CMS 2015-04-02 18:31:37

+0

所以它適合你嗎? – Yura 2015-04-02 18:32:54

+0

我如何調用助手做我需要傳遞一個HTML助手作爲參數? – CMS 2015-04-02 18:44:14