اختصاصی کردن Razor برای #C و VB در MVC با استفاده از Extension Method

این مقاله در ادامه مقاله "اختصاصی کردن Razor برای #C و VB در MVC" که توسط آقای مدائنی ایجاد شده ارائه میشود.

اختصاصی کردن Razor برای #C و VB در MVC با استفاده از Extension Method

برای ایجاد یک Extension Method باید NameSpace کلاسی که ایجاد میکنیم را به NameSpace کلاس مورد نظر که میخواهیم برای آن متدی ایجاد کنیم تغییر دهیم. سپس هم کلاس و هم Extension Method ها را public و static می کنیم. بعر از آن برای هر Extension Method پارامتر ورودیی از نوع همان متد تعریف میکنیم و عبارت this را به این پارامتر اضافه میکنیم. در زیر مثالی برای برای کلاس string در .Net میزنیم:

namespace System
{
    public static class StringHelper
    {
        public static string StringConcatenate(this string firstPhrase, string secondPhrase)
        {
            return firstPhrase + secondPhrase;
        }
    }
}

همان طور  مشاهده میکنید namespace کلاس را به رفرنس System  که در Refrences پروژه قرار دارد تغییر دادیم. عبارت this در متد StringConcatenate اشاره به پارامتری دارد که قرار است عملیات این متد روی آن انجام گیرد. به عنوان مثال:

public ActionResult Index()
        {
            "1234".StringConcatenate("567");
            return View();
        }

همان طور که در مثال فوق میبینید عبارت "1234" پارامتر ورودی اول متد میباشد که توسط عبارت this به آن اشاره شده است و "567" پارامتر ورودی دوم.

حال برای اختصاصی کردن Razor با استفاده از Extension Method از کلاس زیر استفاده میکنیم:

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();
        }
    }
}

در این کلاس یک Extansion Method و  یک متد داخلی تعریف شده و کار متد داخلی فیلتر کردن string هایی است که شامل عبارت "vbhtml" میباشند.

سپس در فایل Global.asax پروژه در قسمت Application_Start کد های زیر را اضافه میکنیم:

            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new RazorViewEngine().DisableVbhtml());

امیدوارم مطالب فوق مفید و مؤثر باشند

فایل های ضمیمه