O'z yordamchisidan foydalanmoqchimisiz? Html.BeginForm kabi

Men hayron bo'ldim, o'zingizning yordamchingiz ta'rifini yaratishingiz mumkinmi? masalan, quyidagi shaklni yaratgan:

using (Html.BeginForm(params)) 
{
}

Men o'z yordamchimga shunday qilishni xohlayman. Shunday qilib men oddiy misolni qilmoqchiman

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 javoblar

Albatta, bu mumkin:

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
qo'shib qo'ydi
Bir narsani ta'kidlash kerakki ... ToString() dasturini bo'sh joyga qaytarishingiz kerak. Masalan, siz TableData.HtmlExtensions.Table jadvaliga o'xshash matnni ko'rmasangiz.
qo'shib qo'ydi muallif Romias, manba
@RonSijm, siz ushbu kodni HtmlExtensions.cs faylida Extensions papkasida joylashtirishingiz mumkin. Kengaytma usuliga kirishingiz uchun siz bu sinfning sizning fikringiz bo'yicha aniqlangan nom maydoni olib kelishiga ishonch hosil qiling: @appName.Extensions .
qo'shib qo'ydi muallif Darin Dimitrov, manba
@RonSijm nomfazosini ~/Views/web.config faylida bo'limiga qo'shishingiz mumkin ( emas, balki ~ /web.config ). Shunday qilib yordamchi sizning arizangizda umuman mavjud bo'ladi. Yoki oddiygina nom satrini barcha standart yordamchilar aniqlangan System.Web.Mvc.Html ga o'zgartiring.
qo'shib qo'ydi muallif Darin Dimitrov, manba
@Romias Men buni o'zingizning ustara shablonlarida "foydalanish" ni o'z ichiga olmayman.
qo'shib qo'ydi muallif emragins, manba
Yaxshi, rahmat. Agar siz buni sinfda qilsangiz, men odatiy @helper Method() bilan mumkin emas deb taxmin qilyapmanmi? Bundan tashqari, qaerga qo'yaman? Men faqat app_code papkasida yordamchilarning qolganlari bilan qo'yib berishga urindim, ammo bu ishlamayapti.
qo'shib qo'ydi muallif Ron Sijm, manba
Rahmat, bu ish kabi ko'rinadi. Juda yomon bo'lsa-da, faqat _layout.cshtml-da foydalanishni ishga solmayapti.
qo'shib qo'ydi muallif Ron Sijm, manba
rahmat, ism maydoni ham shu jumladan :) ajoyib.
qo'shib qo'ydi muallif Ron Sijm, manba

Ha shunaqa; Lekin Tablehelper. * dan foydalanish uchun siz bazaviy ko'rinishni quyi sinfga qo'shishingiz va Tablehelper xususiyatini kiritishingiz kerak. Ehtimol, HtmlHelper ga kengaytma usulini qo'shish osonroq bo'lishi mumkin:

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

bu sizni yozishga imkon beradi:

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

Lekin, bu navbatda, boshqa bir qator sanitariya-tesisat (elementni BeginTable da ishga tushirishni boshlashi va qaytarilgan qiymatda Dispose() ) da tugatishini talab qiladi).

0
qo'shib qo'ydi