2016-02-26 4 views
0

Я пытаюсь применить некоторые настраиваемые шаблоны к виду бритвы. Это немного особенный, вот пример.Пользовательский шаблон в режиме бритвы

Эта модель содержит объект Person с именем и фамилией.

шаблон будет выглядеть следующим образом ведьма я написал бы в файле cshtml

<div data-template-id="testTemplate" data-template-model="@Model.Person"> 
<span>{{Firstname}}</span> 
<span>{{Lastname}}</span> 
</div> 

Я бы тогда сделать метод HtmlHelper, заполняющий шаблон с данными из Model.Person

Так хар у меня есть получил доступ к данным, но я не уверен, как получить доступ к представлению и получить шаблон.

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){ 
    var model = html.ViewData.Model; 
     string propName = ""; 
     if (expression.Body is MemberExpression) 
      propName = ((MemberExpression)expression.Body).Member.Name; 
     var value = model.GetType().GetProperty(propName).GetValue(model, null); 
     // TODO: get template and insert data from model 
     return new MvcHtmlString($"<div>{value}</div>"); 
} 

Я знаю, что это немного странно, почему я сделал бы это. Но короткий ответ заключается в том, что в некоторых условиях мне нужно вернуть некоторые совершенно разные html, основанные на некоторых внутренних условиях. В этом случае я просто полностью удалю шаблон.

+0

Сначала я бы предложил вам описать, что вам нужно сделать без htmlhelper, потому что мне кажется, что вы слишком усложняете вещи. Если вам действительно нужно пройти модель и шаблон, вы можете сделать что-то вроде: public static IHtmlString Test (этот помощник HtmlHelper, модель ModelType, шаблон строки), а затем в бритве Html.Test (модель, @ "ваш шаблон здесь"); – eugen

+0

Причина, по которой я не вводил шаблон, как вы предположили, объясняется тем, как я намерен его использовать. При написании шаблона/разметки я хочу, чтобы Visual Studios intellisense и форматирование кода. И все это будет потеряно, если я напишу его как строковый ввод. – Galtrold

ответ

0

Я нашел решение этой проблемы самостоятельно. Я закончил тем, что использовал метод @helper в качестве шаблона. Как это

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    var someCondition = false; 

    if (someCondition) 
    { 
     // Return some domain specific html. 
     return new MvcHtmlString("<div></div>"); 
    } 
    else 
    { 
     var result = expression.Compile(); 

     TModel model = html.ViewData.Model; 

     var value = result(model); 

     var r = new MvcHtmlString(value.ToString()); 
     return r; 
    } 
} 

Я бы затем использовать его как это:

@Html.Test(p => ImageTemplate(p.Avater)) 
@helper ImageTemplate(Picture avater) 
{ 
    <h1 style="color: red">@avater.Title</h1> 
    <h5>@avater.Url</h5> 
} 

Этот метод обеспечивает форматирование кода, IntelliSense, повторное использование и, конечно же, возможность переопределить отверстие вещь.

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