Kendi yardımcısı için kullan? Html.BeginForm gibi

Merak ediyordum, kendi yardım tanımınızı yaratmak mümkün mü? Bir form oluşturan aşağıdaki gibi:

using (Html.BeginForm(params)) 
{
}

Kendi yardımcımı böyle yapmak isterim. Yani basit bir örnek yapmak istiyorum

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 cevap

Elbette, mümkün:

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
katma
Unutulmaması gereken bir şey ... Tablodaki boşluğu döndüren ToString() 'i geçersiz kılmanız gerekir ... eğer tablonuzda YourDomain.HtmlExtensions.Table gibi bir metin göreceksiniz.
katma yazar Romias, kaynak
@RonSijm, bu sınıfı örneğin Extensions klasörünün içindeki HtmlExtensions.cs dosyasına yerleştirebilirsiniz. Sadece, bu sınıfın içine alan adını tanımladığınız ad alanını getirdiğinizden emin olun, böylece uzantı yöntemine erişebilirsiniz: @using AppName.Extensions .
katma yazar Darin Dimitrov, kaynak
@RonSijm, ad alanını ~/Views/web.config dosyasının bölümüne ekleyebilirsiniz ( not ~ /web.config ). Bu sayede yardımcı uygulamalarınızda evrensel olarak mevcut olacaktır. Veya ad alanını tüm standart yardımcıların tanımlandığı System.Web.Mvc.Html olarak değiştirin.
katma yazar Darin Dimitrov, kaynak
@Romias Ben ustura şablonlarında "kullanarak" dahil etmek ihmal ettiğimde bu olay olduğunu fark ettim.
katma yazar emragins, kaynak
Tamam teşekkürler. Bunu bir sınıfta yaptığınızdan beri, düzenli bir @helper Method() ile mümkün olmadığını varsayıyorum? Ayrıca, bunu nereye yerleştiririm? Sadece app_code klasörüne yardımcıların geri kalanıyla koymaya çalıştım ama işe yaramadı.
katma yazar Ron Sijm, kaynak
teşekkürler, bu işe yarıyor. Çok kötü, sadece _layout.cshtml içinde kullanmak yerine çalışmıyor.
katma yazar Ron Sijm, kaynak
teşekkürler, ad alanı çalıştıran dahil :) harika.
katma yazar Ron Sijm, kaynak

Evet öyle; ancak Tablehelper. * 'i kullanmak için, temel görünümü alt sınıflara ayırmanız ve bir Tablehelper özelliği eklemeniz gerekir. Yine de, daha kolay, HtmlHelper için bir uzantı yöntemi eklemek:

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

hangi yazmanıza izin verecek:

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

Ancak bu, diğer çeşitli tesisatlar bitini gerektirir ( BeginTable öğesinde başlatmak ve Dispose() ile döndürülen değerde).

0
katma