2013-09-16 4 views
0

Я хотел бы реализовать что-то похожее на @ Html.TextBoxFor, но вместо этого вызывается @ Html.SwitchFor(), чтобы создать переключатель yes/no из bool, который я использую, без необходимости добавлять дополнительные html и классы каждый раз.Как я могу создать собственный метод Помощника Razor, например @ Html.TextBoxFor()?

Есть ли способ сделать это с помощью синтаксиса бритвы?

ответ

0

Я нашел некоторую помощь Here:

Некоторые простой пример кода:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString SwitchSlider(this HtmlHelper helper, bool value) 
    { 
     return new MvcHtmlString("<div>html i want to output here</div>"); 
    } 
} 

Что позволяет сделать это:

@Html.SwitchSlider(true); 

Я до сих пор не знаете, как воспроизвести что-то вроде TextBox Для и для проезда x => x.param

0

Возможно, вам повезет с этим.

Обратите внимание, что вы должны найти себе парит над TextBoxFor и нажав F12 в Visual Studio и вы получите сигнатуру метода, который вы пытаетесь подражать. Это хорошее место для начала, хотя немного читать трудно, если вы не тратите время.

public static MvcHtmlString SwitchFor<TModel>(
    this HtmlHelper<TModel> helper, Expression<Func<TModel, 
      Object>> expression, Boolean wrap) 
    { 
     return wrap 
      ? MvcHtmlString.Create(String.Format("<div class='helloworld'>{0}</div>", 
       helper.TextAreaFor(expression))) : helper.TextAreaFor(expression); 
    } 

Пропустите Right Stuff

Вам нужно пройти Expression к расширения TextBoxFor. Подпись метода для m => - Func, которая передает вашу функцию TModel (m) и возвращает объект.

делать то, что вы хотите и Возвратить реализацию по умолчанию

Вы можете положить что-нибудь там. Вы можете видеть, что я просто возвращаю исходный вызов метода, передавая выражение, если для wrap установлено значение false.

сделать вызов

Все, что осталось сделать, это вызов, как вы намеревались в первую очередь.

@(Html.SwitchFor(m => m.Data, true)) 

Сделать стартовой Helper

Это немного сложнее, чем я первый ожидал, но это может быть сделано, просто добавьте следующий код в ваш папку App_Code в cshtml файл твой выбор.Поскольку вы не можете использовать Generics в функциях помощников, вам необходимо создать реальную функцию с правильной подписью в блоке @function {}.

@using System.Linq.Expressions 
@using System.Web.Mvc; 
@using System.Web.Mvc.Html; 
@functions 
{ 
    public static HelperResult SwitchFor<TModel, Object>(HtmlHelper<TModel> html, Expression<Func<TModel, Object>> func, Boolean wrap) 
    { 
     var data = html.TextAreaFor(func); 
     return WrapItUp(data); 
    } 
} 
@helper WrapItUp(MvcHtmlString data) 
{ 
    <div class="helloworld"> 
     @(data) 
    </div> 
} 

сделать вызов, ну почти

Вы должны пройти экземпляр HtmlHelper, введенный в вашей модели.

@(Html.SwitchFor(Html, m => m.Data, true)) 

Кстати, Это здорово! Это поможет мне с выделением многоколоночных форм более естественным образом. Я рад, что наткнулся на ваш вызов, потому что это решение, о котором я не думал сам.

Удачи вам весело!

Смежные вопросы