0

我最近刚开始涉足 ASP.NET MVC 1.0 并遇到了很棒的 MVCContrib。我原本打算创建一些扩展的 html 助手,但在找到 FluentHTML 后决定尝试创建自定义输入元素。基本上,我希望最终创建几个自定义输入元素,以使我正在处理的项目中的其他一些开发人员更容易将他们的输入字段添加到页面,并让我所有的首选标记为他们呈现。所以,简而言之,我想用额外的标记来包装某些输入元素。一个 TextBox 将被包装在一个<li />例子中。

我已经按照 Tim Scott 在此处的另一个问题中的回答创建了我的自定义输入元素:DRY in the 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 TextBox 之外,我没有得到任何东西,而不是包含在<li></li>元素中。

我在这里想念什么?

非常感谢您的帮助。

4

1 回答 1

1

一切正常...

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));
    }
}
于 2010-05-08T07:11:08.553 回答