0

私は最近、ASP.NET MVC 1.0 に手を出し始めたばかりで、素晴らしい MVCContrib に出会いました。私は当初、いくつかの拡張 HTML ヘルパーを作成する道をたどっていましたが、FluentHTML を見つけた後、カスタム入力要素を作成することにしました。基本的に、私が取り組んでいるプロジェクトの他の開発者が入力フィールドをページに追加し、好みのマークアップをすべてレンダリングできるようにするために、最終的にいくつかのカスタム入力要素を作成したいと考えています。要するに、特定の入力要素を追加のマークアップでラップしたいと思います.TextBoxは<li />、たとえば.

ここの別の質問でのティム・スコットの回答に従って、カスタム入力要素を作成しました: 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:") %>

<li></li>とにかく、要素にラップされていない、標準の FluentHTML TextBox 以外は何も取得していません。

ここで何が欠けていますか?

ご協力いただきありがとうございます。

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 に答える