独自のヘルパーを使用して作成しますか? Html.BeginFormのような

私は疑問を抱いていました。あなた自身のヘルパー定義を作成することは可能ですか?次のようなフォームを作成します。

using (Html.BeginForm(params)) 
{
}

私は自分のヘルパーをそうしたいと思っています。だから私がしたい簡単な例

using(Tablehelper.Begintable(id)
{
    <th>content etc<th>
}

which will output in my view

<table>
  <th>content etc<th>
</table>

Is this possible? if so, how?

Thanks

10

2 答え

確かに、それは可能です:

public static class HtmlExtensions
{
    private class Table : IDisposable
    {
        private readonly TextWriter _writer;
        public Table(TextWriter writer)
        {
            _writer = writer;
        }

        public void Dispose()
        {
            _writer.Write("</table>");
        }
    }

    public static IDisposable BeginTable(this HtmlHelper html, string id)
    {
        var writer = html.ViewContext.Writer;
        writer.Write(string.Format("<table id=\"{0}\">", id));
        return new Table(writer);
    }
}

and then:

@using(Html.BeginTable("abc"))
{
    @:<th>content etc<th>
}

will yield:

<table id="abc">
    <th>content etc<th>
</table>

I'd also recommend you reading about Templated Razor Delegates.

19
追加された
あなたがテーブルクラスで空を返すToString()をオーバーライドする必要があります。そうでなければ、YourDomain.HtmlExtensions.Tableのようなテキストがテーブルに長く表示されます。
追加された 著者 Romias,
@RonSijmでは、このクラスを拡張子フォルダ内の HtmlExtensions.cs ファイルに配置することができます。このクラスが定義されている名前空間をビューのスコープに持ってきて、拡張メソッド @using AppName.Extensions にアクセスできるようにしてください。
追加された 著者 Darin Dimitrov,
@RonSijmでは、〜/ Views/web.config ファイルの セクションに名前空間を追加できます(ない 〜 /web.config )。この方法で、ヘルパーはアプリケーション内で普遍的に利用可能になります。または、その名前空間をすべて標準ヘルパーが定義されている System.Web.Mvc.Html に変更するだけです。
追加された 著者 Darin Dimitrov,
@Romias私は自分のカミソリのテンプレートに "使用する"を含めることを怠ったとき、私はこれが起こったことに気づいた。
追加された 著者 emragins,
ありがとう、ありがとう。あなたがクラスでこれをしたので、私はそれが通常の@helper Method()で可能ではないと思いますか?また、どこに配置するのですか?残りのヘルパーとapp_codeフォルダに入れてみましたが、うまくいかないようです。
追加された 著者 Ron Sijm,
ありがとう、それは動作するようです。あまりにも悪いのは、単に_layout.cshtmlで使用するだけでは動作しません。
追加された 著者 Ron Sijm,
ありがとう、名前空間を含む:)素晴らしい。
追加された 著者 Ron Sijm,

はい、そうです;ただし、 Tablehelper。* を使用するには、ベースビューをサブクラス化して Tablehelper プロパティを追加する必要があります。ただし、 HtmlHelper に拡張メソッドを追加するほうが簡単でしょう。

public static SomeType BeginTable(this HtmlHelper html, string id) {
    ...
}

次のように書くことができます:

using (Html.BeginTable(id))
{
    ...
}

BeginTable で要素を開始し、返された値に Dispose()で終了させる)さまざまな配管のビットを必要とします。

0
追加された