2010-01-27 96 views
0

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

我在蒂姆斯科特的另一个问题的回答下面创建了我的自定义输入元素: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文本框等,而不是包裹在<li></li>元素。

我在这里错过了什么?

非常感谢您的帮助。

回答

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)); 
    } 
} 
+0

的区别是调用base.ToString()代替的ToString() – 2010-08-05 15:23:43