اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
سه دقیقه
در این مقاله ما میخواهیم RazorViewEngine را با استفاده از یک Extension Method به گونه ای تنظیم کنیم که فقط به دنبال Viewهایی که مربوط به C# هستند بگردد. در ابتدای مقاله توضیح خلاصه ای درباره Extension Method خواهیم داشت و سپس نحوه اختصاصی کردن Razor برای C# را خواهیم دید.
2. سپس متد مورد نظر را مینویسیم:
3. کلاس و متدی که در آن تعریف میکنیم بایستی public و static باشند. namespace کلاس را نیز به namespace کلاس string در .Net (یعنی System) تغییر میدهیم.
4. در Extension Methodها ورودی اول تابع به پارامتری اشاره دارد که قرار است هنگام استفاده از آن (یا صدا زدن آن) متد، عملیات مورد نظر را روی آن اجرا کند. به همین جهت عبارت this را به پارامتر ورودی اول تابع میدهیم.
برای استفاده از این متد کافیست پس از یک عبارت string متد را فراخوانی کنیم:
همانطور که میبینید در ظاهر تابع فقط یک ورودی دارد ولی ما دو ورودی برای آن در نظر گرفتیم. در واقع ورودی اول تابع قبل از "." (دات) آمده است و عبارت this به آن اشاره دارد.
از آن جایی که کلاس RazorViewEngine برای شناسایی viewها شامل Peroperty هایی از جنس []string میباشد، ابتدا متدی ساده به نام FilterOutVbhtml برای فیلتر کردن stringهای حاوی عبارت "vbhtml" مینویسیم.
در ادامه، در بدنه متد DisableVbhtml پروپرتیهای RazorViewEngine را فرا خوانی کرده و با استفاده از متد FilterOutVbhtml آنها را فیلتر میکنیم.
سپس در فایل Global.asax در Application_Start یکبار ViewEngineها را حذف میکنیم -Engine مربوط به aspx به صورت پیش فرض فعال میباشد- و سپس RazorViewEngine را به همراه فراخوانی Extension Method خودمان به ViewEngineها اضافه میکنیم.
امیدوارم مطالب فوق برای شما مفید و کارآمد باشد.
Extension Methodها بسیار کارآمد هستند و نحوه ایجاد و استفاده از آنها بسیار راحت است. به گونه ای که میتوان آنها را حتی برای کلاسهای از قبل تعریف شده .Net نیز ایجاد کرد و در سرتاسر برنامه از آن استفاده کرد.
با مثالی ساده نحوه ایجاد و استفاده از Extension Method را میبینیم. در این مثال ما سعی داریم متدی برای کلاس string در .Net بنویسیم که دو رشته را به هم بچسباند.
1. ابتدا کلاسی در دایرکتوری دلخواه ایجاد میکنیم.
namespace ApplicationTest01.Utilities { public class StringHelper { } }
namespace ApplicationTest01.Utilities { public class StringHelper { public string StringConcatenate(string firstPhrase, string secondPhrase) { return firstPhrase + secondPhrase; } } }
namespace System { public static class StringHelper { public static string StringConcatenate(string firstPhrase, string secondPhrase) { return firstPhrase + secondPhrase; } } }
namespace System { public static class StringHelper { public static string StringConcatenate(this string firstPhrase, string secondPhrase) { return firstPhrase + secondPhrase; } } }
public ActionResult Index() { "1234".StringConcatenate("567"); string s1 = "dotnet"; string s2 = "tips"; s1.StringConcatenate(s2); return View(); }
برای اختصاصی کردن RazorViewEngine برای C#، مشابه روند فوق یک Extension Method ایجاد میکنیم که namespace کلاس آن با namespace کلاس RazorViewEngine (یعنی System.Web.Mvc ) یکی باشد. خروجی Extension Method ما از نوع RazorViewEngine میباشد:
namespace System.Web.Mvc { public static class EngineFilter { public static RazorViewEngine DisableVbhtml(this RazorViewEngine engine) { return engine; } } }
namespace System.Web.Mvc { public static class EngineFilter { public static RazorViewEngine DisableVbhtml(this RazorViewEngine engine) { return engine; } private static string[] FilterOutVbhtml(string[] source) { return source.Where(s => !s.Contains("vbhtml")).ToArray(); } } }
namespace System.Web.Mvc { public static class EngineFilter { public static RazorViewEngine DisableVbhtml(this RazorViewEngine engine) { engine.AreaViewLocationFormats = FilterOutVbhtml(engine.AreaViewLocationFormats); engine.AreaMasterLocationFormats = FilterOutVbhtml(engine.AreaMasterLocationFormats); engine.AreaPartialViewLocationFormats = FilterOutVbhtml(engine.AreaPartialViewLocationFormats); engine.ViewLocationFormats = FilterOutVbhtml(engine.ViewLocationFormats); engine.MasterLocationFormats = FilterOutVbhtml(engine.MasterLocationFormats); engine.PartialViewLocationFormats = FilterOutVbhtml(engine.PartialViewLocationFormats); engine.FileExtensions = FilterOutVbhtml(engine.FileExtensions); return engine; } private static string[] FilterOutVbhtml(string[] source) { return source.Where(s => !s.Contains("vbhtml")).ToArray(); } } }
ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine().DisableVbhtml());
منبع: stackoverflow.com