2010-01-27 121 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

相關問題