ساختن متدهاي كمكي 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 به اونا دسترسي داريم استفاده كنيم.البته براي رفع اين مشكل روشي اينجا معرفي شده كه ميتونيد استفاده كنيد.
جالب بود.
پاسخحذففقط یه سوال: آیا بهتر نیست که این گونه موارد رو به داخل Controler انتقال بدیم و اونجا تصمیم بگیریم که چه ستون هایی تغییر رنگ داده بشن؟
متدهاي كمكي Razor براي كپسوله كردن كد View استفاده ميشن و چون اين كار (رنگي كردن يك ستون) مربوط به View ميشه فكر ميكنم داخل View باشه منطق تره.
پاسخحذفبراي مثال ميشه ازش براي Alternate كردن سطر هاي Grid استفاده كرد
حرف شما صحیحه. فقط اگه مثلا برنامه شما دارای دو تا واسط باشه (یک مخصوص موبایل یکی عادی)بعد باید این بخش تغییر رنگ و کنترل مربوط به رنگ رو دو جا نوشت! ولی اگه تصمیم گیری در مورد اینکه این بخش دارای حد آستانه (مخصوص) است یا نه به داخل کنترلر باشه و در View فقط تصمیم بگیریم که رنگیش کنیم یا نه یکم بهتر نیست؟
پاسخحذفدقيقا قسمت دوم اين پست به همين موضوع پرداخته كه همون بحث Reusability هستش و متد كمكي در سطح برنامه نوشته ميشه و در تمام View ها قابل استفاده ميشه.
پاسخحذفاگه اون قسمت Controller كه مد نظرتون هست رو تو pastebin برام بنويسيد ممنون ميشم.
بازم حرف شما صحیحه. منظور من جدا کردن بیزینس رولها از نمایشه. میشه در مدل ایجاد شده یک پروپرتیه به نام "آیا در محدوده آستانه است؟" ایجاد کرد و اون عدد "9" رو در کدهای شما به داخل کنترلر (و از اونجا شاید به یه بخش دیگه) منتقل کرد. چون به نظر من اون عدد "9" خیلی جالب نیست که اینجا (توی یه ویو) باشه. وگرنه کار شما و حرف شما درسته و با استفاده از این متدهای کمکی به قول استیو آلن کلی کد زشت رو توی ویومون نمی نویسیم.
پاسخحذفمتوجه منظور شما شدم و دقيقا درسته.
پاسخحذفبراي مثال براي مشخص كردن آلبوم هاي موجود تو انبار ميايم يه Property بنام Instock داخل Model ميزاريم و موقع رندر كردن View براساس اون Property مثلا رنگش رو قرمز ميكنيم و...
زنده باد. مثال عالی بود.
پاسخحذف