Проблема создания пользовательского элемента ввода с помощью FluentHtml (MVCContrib) - PullRequest
0 голосов
/ 27 января 2010

Я только недавно начал заниматься ASP.NET MVC 1.0 и наткнулся на замечательный MVCContrib. Первоначально я пошел по пути создания некоторых расширенных помощников HTML, но после обнаружения FluentHTML решил попробовать свои силы в создании пользовательского элемента ввода. По сути, я хочу в конечном итоге создать несколько пользовательских элементов ввода, чтобы другим разработчикам проекта, над которыми я работаю, было проще добавлять их поля ввода на страницу и отображать для них всю предпочитаемую разметку. Короче говоря, я бы хотел обернуть некоторые элементы ввода дополнительной разметкой. Например, TextBox будет заключен в <li />.

Я создал свои пользовательские элементы ввода после ответа Тима Скотта на другой вопрос здесь: СУХОЙ в MVC View .

Итак, чтобы уточнить, я создал свой класс "TextBoxListItem":

public class TextBoxListItem : TextInput<TextBox>
{
    public TextBoxListItem (string name) : base(HtmlInputType.Text, name) { }

    public TextBoxListItem (string name, MemberExpression forMember, IEnumerable<IBehaviorMarker> behaviors) : base(HtmlInputType.Text, name, forMember, behaviors) { }

    public override string ToString()
    {
        var liBuilder = new TagBuilder(HtmlTag.ListItem);
        liBuilder.InnerHtml = ToString();
        return liBuilder.ToString(TagRenderMode.SelfClosing);
    }
}

Я также добавил его в свой класс ViewModelContainerExtensions:

public static TextBox TextBoxListItem<T>(this IViewModelContainer<T> view, Expression<Func<T, object>> expression) where T : class
{
    return new TextBoxListItem(expression.GetNameFor(view), expression.GetMemberExpression(), view.Behaviors)
            .Value(expression.GetValueFrom(view.ViewModel));
}

И, наконец, я также добавил его в ViewDataContainerExtensions:

public static TextBox TextBoxListItem(this IViewDataContainer view, string name)
{
    return new TextBox(name).Value(view.ViewData.Eval(name));
}

Я называю это, на мой взгляд, так:

<%= this.TextBoxListItem("username").Label("Username:") %>

В любом случае, я не получаю ничего, кроме стандартного текстового поля FluentHTML, не обернутого в <li></li> элементов.

Что мне здесь не хватает?

Большое спасибо за любую помощь.

1 Ответ

1 голос
/ 08 мая 2010

Все работает ...

public class TextBoxListItem : TextInput<TextBoxListItem>
{
    public TextBoxListItem(string name) : base(HtmlInputType.Text, name) { }

    public TextBoxListItem(string name, MemberExpression forMember, IEnumerable<IBehaviorMarker> behaviors) : base(HtmlInputType.Text, name, forMember, behaviors) { }

    public override string ToString()
    {
        var liBuilder = new TagBuilder(HtmlTag.ListItem);
        liBuilder.InnerHtml = base.ToString();
        return liBuilder.ToString(TagRenderMode.Normal);
    }
}
public static class ViewDataContainerExtensions
{
    public static TextBoxListItem TextBoxListItem(this IViewDataContainer view, string name)
    {
        return new TextBoxListItem(name).Value(view.ViewData.Eval(name));
    }
}
public static class ViewModelContainerExtensions
{
    public static TextBoxListItem TextBoxListItem<T>(this IViewModelContainer<T> view, Expression<Func<T, object>> expression) where T : class
    {
        return new TextBoxListItem(expression.GetNameFor(view), expression.GetMemberExpression(), view.Behaviors)
                .Value(expression.GetValueFrom(view.ViewModel));
    }
}
...