2014-11-16 3 views
3

Рассмотрим следующую ASP.NET MVC вид бритвой фрагмент, который определяет помощникаПреобразование ASP.NET MVC Razor @helper функционировать в метод вспомогательный класс

@helper FieldFor<TModel>(Expression<Func<TModel, string>> expression) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(expression, 
         htmlAttributes: 
          new {@class = "control-label col-md-2"}) 

     <div class="col-md-10"> 
      @Html.EditorFor(expression, 
          new 
          { 
           htmlAttributes = 
           new {@class = "form-control"} 
          }) 
      @Html.ValidationMessageFor(expression, "", 
             new {@class = "text-danger"}) 

     </div> 
    </div> 
} 

Что такое шаблон для преобразования его в метод из класса похож на:

public static MvcHtmlString FieldFor(this HtmlHelper helper, FieldFor<TModel>(Expression<Func<TModel, string>> expression)) 
{ 
    /* Method */ 
} 

Все примеры, которые я нашел внимание на создании разметки, которая не опирается на другие HTML-хелперов.

+0

Я думаю, что объявляя его как метод расширения является способ сделать то, что вы хочу (как и вы, выше). В чем проблема? Вы не хотите, чтобы метод расширения возвращал разметку? Если вы ищете регулярные функции для использования в скриптах Razor, вы можете использовать код @functions. Таким образом вы объявляете обычные методы, без необходимости возврата разметки. Я просто не знаю, можно ли создать внешний файл с объявлением кода с использованием «@functions», который будет использоваться в вашем коде Razor где угодно. – Veverke

+0

Нет проблем. Я ищу метод для создания метода @helper для метода расширения с одинаковой функциональностью. В сущности, я хотел бы переместить эти методы расширения в библиотеку классов, где их можно повторно использовать между различными приложениями ASP.NET MVC. – bloudraak

+0

Кажется, у вас уже есть ответ. Я считаю, что все, что нужно сделать, - это создать методы расширения на MvcHtmlString и использовать класс TagBuilder для создания разметки вместо прямого их возврата. Затем ваши методы расширения должны возвращать новую MvcHtmlString (yourTag.toString()). – Veverke

ответ

4

подпись должны быть

public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 

Затем вы используете комбинацию TagBuilder и встроенных методов HTML-хелперов для генерации HTML-

using System; 
using System.Linq.Expressions; 
using System.Text; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace YourAssembly.Html 
{ 
    public static class FieldHelper 
    { 
    public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     MvcHtmlString label = LabelExtensions.LabelFor(helper, expression, new { @class = "control-label col-md-2" }); 
     MvcHtmlString editor = EditorExtensions.EditorFor(helper, expression, new { htmlAttributes = new {@class = "form-control"}}) 
     MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression, null, new { @class = "text-danger" }); 

     StringBuilder html = new StringBuilder(); 
     html.Append(editor); 
     html.Append(validation); 
     TagBuilder innerDiv = new TagBuilder("div"); 
     innerDiv.AddCssClass("col-md-10"); 
     innerDiv.InnerHtml = html.ToString(); 
     html = new StringBuilder(); 
     html.Append(label); 
     html.Append(innerDiv.ToString()); 
     TagBuilder outerDiv = new TagBuilder("div"); 
     outerDiv.AddCssClass("form-group"); 
     outerDiv.InnerHtml = html.ToString(); 
     return MvcHtmlString.Create(outerDiv.ToString()); 
    } 
    } 
} 

Тогда ваш может сделать его доступным во всех ваших просмотров за счет добавления его к web.config

<system.web.webPages.razor> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     .... 
     <add namespace="YourAssembly.Html" /> 
    </namespaces> 
0

Должно быть достаточно легко. Вам нужно только написать это как метод расширения в HtmlHelper и использовать TagBuilder для построения HTML:

namespace Sample.Extensions 
{ 
    using System; 
    using System.Linq.Expressions; 
    using System.Web.Mvc; 
    using System.Web.Mvc.Html; 

    public static class TestExtensions 
    { 
     public static MvcHtmlString FieldFor<TModel>(
             this HtmlHelper<TModel> helper, 
             Expression<Func<TModel, string>> expression) 
     { 
      var mainDiv = new TagBuilder("div"); 
      mainDiv.AddCssClass("form-group"); 

      mainDiv.InnerHtml += helper.LabelFor(expression); 

      var colDiv = new TagBuilder("div"); 
      colDiv.AddCssClass("col-md-10"); 
      colDiv.InnerHtml += helper.EditorFor(expression, 
               new 
               { 
                htmlAttributes = 
                 new {@class = "form-control"} 
               }) 
      colDiv.InnerHtml += helper.ValidationMessageFor(
             expression, 
             "", 
             new {@class = "text-danger"}); 

      mainDiv.InnerHtml += colDiv; 

      return new MvcHtmlString(mainDiv.ToString(TagRenderMode.Normal)); 
     } 
    } 
} 

Использование в целях:

@using Sample.Extensions 
@model ... 
... 
@Html.FieldFor(m => m.MyField) 
+0

Ваш ответ работает на мое решение; ответ @stephen разрешает его для всех свойств. – bloudraak