39

初めての asp.net mvc アプリケーションを作成していますが、カスタム Html ヘルパーについて質問があります。

フォームを作成するには、次を使用できます。

<% using (Html.BeginForm()) {%>
   *stuff here*
<% } %>

カスタム HTML ヘルパーで同様のことをしたいと思います。言い換えれば、私は変更したい:

Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();

の中へ:

using Html.BeginTr(){
    Html.Td(day.Description);
}

これは可能ですか?

4

3 に答える 3

49

これがc#での再利用可能な実装の可能性です:

class DisposableHelper : IDisposable
{
    private Action end;

    // When the object is created, write "begin" function
    public DisposableHelper(Action begin, Action end)
    {
        this.end = end;
        begin();
    }

    // When the object is disposed (end of using block), write "end" function
    public void Dispose()
    {
        end();
    }
}

public static class DisposableExtensions
{
    public static IDisposable DisposableTr(this HtmlHelper htmlHelper)
    {
        return new DisposableHelper(
            () => htmlHelper.BeginTr(),
            () => htmlHelper.EndTr()
        );
    }
}

この場合、応答ストリームBeginTrEndTr直接書き込みます。文字列を返す拡張メソッドを使用する場合は、次を使用して出力する必要があります。

htmlHelper.ViewContext.HttpContext.Response.Write(s)
于 2009-03-24T10:39:54.993 に答える
33

MVC3 でここに記載されているアドバイスに従ってみましたが、次の使用で問題が発生しました。

htmlHelper.ViewContext.HttpContext.Response.Write(...);

このコードを使用すると、レイアウトがレンダリングされる前に、ヘルパーが応答ストリームに書き込みを行っていました。これはうまくいきませんでした。

代わりにこれを使用しました:

htmlHelper.ViewContext.Writer.Write(...);
于 2011-05-19T21:47:29.177 に答える
19

ASP.NET MVC(Codeplexで入手可能)のソースを見ると、BeginFormの実装が最終的に次のコードを呼び出すことがわかります。

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
    TagBuilder builder = new TagBuilder("form");
    builder.MergeAttributes<string, object>(htmlAttributes);
    builder.MergeAttribute("action", formAction);
    builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
    htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag));

    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}

MvcFormクラスはIDisposableを実装し、disposeメソッドは応答に</form>を書き込みます。

したがって、必要なのは、ヘルパーメソッドに必要なタグを書き込み、IDisposableを実装するオブジェクトを返すことです...disposeメソッドでタグを閉じます。

于 2009-03-24T10:38:24.887 に答える