Как написать помощник HTML, который работает с классом - PullRequest
0 голосов
/ 14 февраля 2012

Мне нужно написать много кода, который будет генерировать шаблоны Knockout JS из классов.

Скажи что-нибудь подобное ...

 <li><span>Surname</span> <span data-bind="text: SURNAME"></span></li>

который я хотел бы вызвать в шаблоне бритвы с чем-то вроде ...

 @className.DisplayMeFor(c=>c.SURNAME)

или даже

 @DisplayMeFor<className>(c=>c.SURNAME)

но я действительно застрял, зная, с чего начать. Мне явно нужно почитать дженерики, но я подумал, что это будет что-то вроде этого ...

public static class HtmlExtensions
{
    public static MvcHtmlString DisplayMeFor<TModel, TValue>(this TModel htmlHelper,   Expression<Func<TModel, TValue>> expression)
    {
        var s = expression.ToString(); //Clearly need a lot more code here to get name, DisplayName etc
        return MvcHtmlString.Create(s);
    }
}

но это не расширение модели (т.е. @ vmAppeal.DisplayMeFor (... не компилируется.

Любые указатели, пожалуйста?

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Решение, которое я придумал, было

public static class Exts
{
    private const string Input = @"<div><span>{0} : </span><input data-bind='value: {1}'></input></div>";
    private const string Display = @"<div><span>{0} : </span><span data-bind='text: {1}'></span></div>";
    private const string DatePicker = @"<div><span>{0} : </span><input data-bind='datepicker: {1}, datepickerOptions: {{  dateFormat: ""dd/mm/yy""}}' /></div>";

    public static MvcHtmlString TemplateFor<TModel>(Expression<Func<TModel, object>> expression, bool edit) where TModel : class  , new()
    {
        var data = new ViewDataDictionary<TModel>();
        var metadata = ModelMetadata.FromLambdaExpression(expression, data);
        var typ = metadata.ModelType;

        var s = edit? Input: Display;
        if (typ == typeof(System.DateTime) ||typ == typeof(System.DateTime?))
        {
            s = edit ? DatePicker : Display;
        }
        return MvcHtmlString.Create(string.Format(s, metadata.GetDisplayName(), metadata.PropertyName));
    }
}

, которое называется

@(Exts.TemplateFor<MyClass>(a=>a.MyField,true))
0 голосов
/ 14 февраля 2012

Попробуйте создать метод расширения для HtmlHelper вместо TModel:

public static class HtmlExtensions
{
    public static MvcHtmlString DisplayMeFor<TModel, TValue>(this HtmlHelper htmlHelper,   Expression<Func<TModel, TValue>> expression)
    {
         // your code here
    }
}

В бритве, просто вызовите свой метод:

@Html.DisplayMeFor(c=>c.SURNAME)

...