ساختن متدهاي كمكي Razor در ASP.NET MVC

در نسخه 3 ي  ASP.NET MVC موتور نمايش(view-engine) جديدي بنام Razor اضافه شده ميزان كد نويسي View ها رو كم كرده.
يكي از قابليت هاي جالب اون ساختن متدهاي كمكي به صورت اعلانيه(Declarative) كه اين امكان رو ميده در همون فايل View مون بتونيم متدهاي كمكي بسازيم كه ازش در سرتاسر اون View استفاده كنيم.
براي مثال فرض كنيد جدولي داريم كه ستوني بنام قيمت(Price) داره حالا ميخواهيم اگه اون ستون كمتر از يك عددي بود اون ستون قرمز بشه و…
براي نوشتن اين مثال از سري آموزشي MVC Music Store استفاده ميكنم.براي همين قسمت Model و Controllers رو نمينويسم.
براي نوشتن متد كمكي از Helper@ استفاده ميكنم و بقيه مراحل دقيقا مثل نوشتن يك متد عاديه البته تنها فرقش با متد اينه كه بدنه ي متد فقط شامل كدهاي C#‎ نيست.

@helper PriceHighlighter(decimal inputPrice, decimal treshold)
    {
        if (inputPrice > treshold)
        {
            <span style="background-color: red">@inputPrice</span>  
        }
        else
        {
            @inputPrice
        }
}

همنطور كه گفتم فرق خاصي با متدهاي عادي نداره.ورودي رو با مقدار مورد نظرمون مقايسه ميكنيم و اگه بيشتر از اون بود يك تگ SPAN با رنگ قرمز و وروديمون برمي گردونيم(من زياد HTML م خوب نيست اگه بجز SPAN تگ ديگه ي ميشه استفاده كرد بگيد).

</td>
	@PriceHighlight(item.Price, 9)
</td>

نحوه استفاده هم مثل فراخواني يك متد عاديه.

تا اينجا بسيار خوب ولي  چندتا مشكل

  • با زياد شدن تعداد متد ها View ي ما پر ميشه از اين متدها كه خوب نيست
  • امكان استفاده از اين متدها محدود به همون View ي هست كه متد داخلش نوشته شده

براي رفع اين مشكل ها بايد تعريف كدهاي كمكيمون رو تو سطح برنامه بنويسم به نوعي Scope كدها رو بيشتر كنيم تا در تمام View ها قابل استفاده باشه.
براي اينكار كافيه يك فولدر بنام App_Code داخل پروژه ايجاد كنيم و داخل اون يك MVC 3 View Page (Razor)‌‎ (يا هر آيتمي با پسوند CSHTML) اضافه كنيم(هرچي داخلش هست رو پاك كنيد) و متدهاي كمكي مورد نظرمون رو داخل اون اضافه كنيم.

نحوه استفاده هم مثل فراخواني متدهاي استاتيك يك كلاس ميمونه مثلا RazorHelpers.PriceHighlighter و…

نكته:با استفاده از اين روش نميتونيم از متدهاي كمكي خود MVC كه از طريق Html به اونا دسترسي داريم استفاده كنيم.البته براي رفع اين مشكل روشي اينجا معرفي شده كه ميتونيد استفاده كنيد.

نظرات

  1. جالب بود.
    فقط یه سوال: آیا بهتر نیست که این  گونه موارد رو به داخل Controler انتقال بدیم و اونجا تصمیم بگیریم که چه ستون هایی تغییر رنگ داده بشن؟

    پاسخحذف
  2. متدهاي كمكي Razor براي كپسوله كردن كد View استفاده ميشن و چون اين كار (رنگي كردن يك ستون) مربوط به View ميشه فكر ميكنم داخل View باشه منطق تره.
    براي مثال ميشه ازش براي Alternate كردن سطر هاي Grid استفاده كرد

    پاسخحذف
  3. حرف شما صحیحه. فقط اگه مثلا برنامه شما دارای دو تا واسط باشه (یک مخصوص موبایل یکی عادی)بعد باید این بخش تغییر رنگ و کنترل مربوط به رنگ رو دو جا نوشت! ولی اگه تصمیم گیری در مورد اینکه این بخش دارای حد آستانه (مخصوص) است یا نه به داخل کنترلر باشه و در View فقط تصمیم بگیریم که رنگیش کنیم یا نه یکم بهتر نیست؟

    پاسخحذف
  4. دقيقا قسمت دوم اين پست به همين موضوع پرداخته كه همون بحث Reusability هستش و متد كمكي در سطح برنامه نوشته ميشه و در تمام View ها قابل استفاده ميشه.
    اگه اون قسمت Controller كه مد نظرتون هست رو تو pastebin برام بنويسيد ممنون ميشم.

    پاسخحذف
  5. بازم حرف شما صحیحه. منظور من جدا کردن بیزینس رولها از نمایشه. میشه در مدل ایجاد شده یک پروپرتیه به نام "آیا در محدوده آستانه است؟" ایجاد کرد و اون عدد "9" رو در کدهای شما به داخل کنترلر (و از اونجا شاید به یه بخش دیگه) منتقل کرد. چون به نظر من اون عدد "9" خیلی جالب نیست که اینجا (توی یه ویو) باشه. وگرنه کار شما و حرف شما درسته و با استفاده از این متدهای کمکی به قول استیو آلن کلی کد زشت رو توی ویومون نمی نویسیم.

    پاسخحذف
  6. متوجه منظور شما شدم و دقيقا درسته.
    براي مثال براي مشخص كردن آلبوم هاي موجود تو انبار ميايم يه Property بنام Instock داخل Model ميزاريم و موقع رندر كردن View براساس اون Property مثلا رنگش رو قرمز ميكنيم و...

    پاسخحذف
  7. زنده باد. مثال عالی بود. 

    پاسخحذف

ارسال یک نظر

پست‌های معروف از این وبلاگ

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک

ساختن ایمیج های داکری به کمک BuildKit - بخش دوم

ساختن ایمیج های داکری به کمک BuildKit - بخش اول