توزیع پروژه‌های ASP.NET MVC بدون ارائه فایل‌های View آن
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

پروژه دیگری از آقای David Ebbo (عضو تیم ASP.NET که پیشتر با پروژه T4 MVC آن در این سایت آشنا شده‌اید)، جهت کامپایل کامل فایل‌های View و ارائه پروژه نهایی ASP.NET MVC بدون نیاز به ارائه پوشه Views آن به نام Razor Generator وجود دارد که در ادامه خلاصه‌ای از نحوه استفاده از آن‌را مرور خواهیم کرد.

الف) ابتدا افزونه Razor Generator را از اینجا دریافت و نصب کنید.
ب) سپس به پروژه MVC خود بسته NuGet زیر را اضافه نمائید:
 PM> Install-Package RazorGenerator.Mvc
در این حالت باید پروژه پیش فرض، همان وب سایت MVC شما انتخاب گردد:


با اضافه کردن این بسته NuGet تغییرات زیر به پروژه جاری اعمال خواهند شد:
  - ارجاعی به اسمبلی RazorGenerator.Mvc.dll به پروژه اضافه خواهد شد.
  - در پوشه App_Start، فایلی به نام RazorGeneratorMvcStart.cs اضافه گردیده و کار تنظیم موتور View مخصوص کار با Viewهای کامپایل شده را انجام می‌دهد.

ج) پس از نصب بسته NuGet یاد شده در همان خط فرمان پاورشل نوگت دستور زیر را صادر کنید:
 PM> Enable-RazorGenerator
و ... همین!

پس از انجام اینکار، دو کار صورت خواهد گرفت:
  - برای تمام Viewهای برنامه، فایل cs متناظری تولید می‌شود که ذیل فایل‌های View قابل مشاهده است.
  - گزینه Custom tool این Viewها نیز به RazorGenerator تنظیم می‌شود.


بدیهی است اگر از دستور Enable-RazorGenerator استفاده نکنید، نیاز خواهید داشت تا تنظیم گزینه Custom tool به RazorGenerator کلیه Viewها را دستی انجام داده و اگر فایل cs متناظر با View تولید نشد روی فایل view کلیک راست کرده و گزینه run custom tool را انتخاب کنید. اما دستور Enable-RazorGenerator کار را بسیار ساده می‌کند.

مزایا:
  - در عمل موتور ASP.NET همین کارها را در زمان اولین بار اجرای Viewها(ی کامپایل نشده) در پشت صحنه انجام می‌دهد. بنابراین با این روش زمان آغاز برنامه سریعتر می‌شود.
  - دیگر نیازی به توزیع فایل‌های cshtml نخواهید داشت.
  - خطایابی Viewها نیز ساده‌تر می‌شود. از این جهت که کامپایل آن‌ها به زمان اجرا موکول نخواهد شد.

یک سری قابلیت‌های دیگر نیز به همراه این پروژه است مانند انتقال Viewها به یک اسمبلی دیگر و یا استفاده از MSBuild برای انجام عملیات که می‌توانید آن‌ها را در Wiki پروژه Razor Generator مطالعه کنید. انتقال Viewها به یک اسمبلی دیگر هرچند در این روش کاملا ممکن شده و کار می‌کند اما صفحه dialog افزودن یک view جدید مهیا در کلیک راست بر روی اکشن متدهای یک کنترلر را غیرفعال می‌کند که در عمل آنچنان جالب نیست.


یک نکته مهم:
اگر در آینده بسته NuGet و افزونه یاد شده را به روز کردید نیاز است دستور زیر را اجرا کنید:
 PM> Redo-RazorGenerator
به این ترتیب بر اساس ساختار و کدهای جدید RazorGenerator، کلیه فایل‌های cs تولید شده مجددا به روز و تولید خواهند شد.


فایل‌های Helper قرار گرفته در پوشه App_Code

اگر HTML Helperهای خود را توسط فایل‌های Razor قرار گرفته در پوشه App_Code تولید می‌کنید، پس از اجرای دستور Enable-RazorGenerator، برای این موارد نیز فایل‌های cs متناظری تولید می‌شود. با این تفاوت که Build Action آن‌ها بر روی Compile قرار ندارند که این مورد را باید دستی تنظیم کنید. همچنین حین استفاده از این توابع کمکی نیاز است فضای نام مرتبط را نیز در ابتدای فایل View خود ذکر کنید مثلا:
 @using MvcViewGenTest2.app_code
البته با استفاده از Razor Generaor دیگر نیازی به استفاده از پوشه App_Code نخواهد بود؛ از این جهت که کار کامپایل خودکار، به زمان اجرا موکول نخواهد شد. بنابراین اینبار در هر جایی که علاقمند بودید می‌توانید این فایل‌های کمکی را تولید و کامپایل کنید. فقط ذکر فضای نام مرتبط را در ابتدای View خود فراموش نکنید.


حذف فایل RazorGeneratorMvcStart.cs
 اگر علاقمند به استفاده از فایل پیش فرض RazorGeneratorMvcStart.cs نیستید و می‌خواهید موتورهای View اضافی را حذف کنید، ابتدا فایل RazorGeneratorMvcStart.cs را حذف کرده و سپس در فایل global.asax.cs تغییر زیر را اعمال نمائید:
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.WebPages;
using RazorGenerator.Mvc;

namespace MvcViewGenTest2
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            // Adding PrecompiledMvcEngine
            var engine = new PrecompiledMvcEngine(typeof(MvcApplication).Assembly);
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(engine);
            VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
        }
    }
}
  • #
    ‫۱۱ سال و ۷ ماه قبل، پنجشنبه ۱۷ اسفند ۱۳۹۱، ساعت ۱۵:۱۴
    چگونه می‌شود این توزیع را برای فایل‌های JQuery انجام داد؟
  • #
    ‫۱۱ سال و ۷ ماه قبل، یکشنبه ۲۰ اسفند ۱۳۹۱، ساعت ۲۳:۰۳
    یک نکته تکمیلی
    این روش چون با MVC3 هم سازگار است مسیرهای Razor2 مانند مسیر زیر را پشتیبانی نمی‌کند:
     <img title="ارسال ایمیل به دوستان" alt="email" src="~/content/images/gmail.png" />
    مسیر فایل‌ها حتما باید توسط Url.Content مشخص شود:
     <img title="ارسال ایمیل به دوستان" alt="email" src="@Url.Content("~/content/images/gmail.png")" />
  • #
    ‫۱۱ سال و ۷ ماه قبل، چهارشنبه ۲۳ اسفند ۱۳۹۱، ساعت ۲۱:۴۶
    اتفاقا چند وقت پیش با RazorGenerator کار کردم اونموقع مطلب شما رو در این باره نخونده بودم با کلی مکافات تونستم ازش خروجی بگیرم که یه سوال برام پیش اومد و ازش منصرف شدم. با توجه به اینکه Razorgenarator یه برای هر view یه فایل cs میسازه و توی اون با استفاده از writer تمام متن داخل view رو به خروجی میفرسته استفاده از یه همچین روشی درسته و بار اضافه روی ایجاد view‌ها نمیزاره ؟
    از روش‌های دیگه استفاده کریدن؟ مثل SparkViewFactory 
    فکر میکنید کدوم بهتره؟
    • #
      ‫۱۱ سال و ۷ ماه قبل، چهارشنبه ۲۳ اسفند ۱۳۹۱، ساعت ۲۳:۲۰
      اگر یک فایل پروژه MVC رو باز کنید چنین تنظیمی داخل آن هست
      <MvcBuildViews>false</MvcBuildViews>
      با true کردن آن (که یک best practice محسوب میشه) هربار «از ابتدا» همین کاری که توسط razor generator انجام می‌شود، برای پیش کامپایل Viewها انجام خواهد شد.
      بنابراین با استفاده از Razor generator به یک مزیت مهم دیگر هم خواهیم رسید:
      بالا رفتن سرعت بررسی زمان کامپایل Viewها بدون نیاز به تغییر فایل پروژه. اگر تعداد Viewها زیاد باشد، تغییر MvcBuildViews به true خیلی زمانبر می‌شود تا حدی که پس از چندبار کامپایل پروژه، شاید مجبور به false کردن آن شویم. اما در حالت استفاده از Razor Generator واقعا سرعت بررسی بسیار بالاتر است؛ چون فایل‌های cs مورد نیاز سایر Viewها پیشتر تهیه شده و زمان تولید آن‌ها یک مرحله کاهش پیدا می‌کند.
  • #
    ‫۱۱ سال و ۶ ماه قبل، شنبه ۳ فروردین ۱۳۹۲، ساعت ۱۶:۵۴
    نکته تکمیلی دو
    در این روش فایل‌های Shared موجود در پوشه views نیاز است توزیع شوند؛ به همراه وب کانفیگ آن و همچنین viewStart. به توزیع سایر فایل‌های view نیازی نیست.
  • #
    ‫۱۱ سال و ۵ ماه قبل، شنبه ۲۱ اردیبهشت ۱۳۹۲، ساعت ۲۰:۵۵
    با سلام.
    کدام بخش‌های یک سایت MVC را برای ارائه نهایی باید توزیع کرد؟
    شما کدام ابزار را برای توزیع پیشنهاد میکنید؟
    • #
      ‫۱۱ سال و ۵ ماه قبل، شنبه ۲۱ اردیبهشت ۱۳۹۲، ساعت ۲۱:۰۲
      در روش متداول: منهای پوشه کنترلر (که کامپایل شده آن در پوشه bin موجود است) و obj، مابقی را باید توزیع کرد.
      + اگر از روش مطرح شده در بحث جاری استفاده می‌کنید، «نکته تکمیلی دو» را که کمی بالاتر مطرح شده لحاظ کنید.
  • #
    ‫۱۱ سال و ۳ ماه قبل، یکشنبه ۲ تیر ۱۳۹۲، ساعت ۲۰:۳۸
    با سلام
    چرا بعد از publish دوباره chtml)view‌ها) ارسال می‌شوند . در صورتی که تمامی کارهای گفته شده در بالا انجام شده ?
    • #
      ‫۱۱ سال و ۳ ماه قبل، یکشنبه ۲ تیر ۱۳۹۲، ساعت ۲۲:۱۵
      publish برای روال معمول و استاندارد کار است. کاری که در اینجا انجام شده غیرمعمول است. مدیریت نهایی انتشار آن دستی خواهد بود (در کل پوشه‌های اسکریپت، content، bin و چند فایل config باید توزیع شوند + نکته تکمیلی 2 که در بالا ذکر شده).
  • #
    ‫۱۰ سال و ۱۲ ماه قبل، سه‌شنبه ۱۶ مهر ۱۳۹۲، ساعت ۲۰:۴۰

    سلام آقای نصیری.من نسخه 2.1.2 Razor Generator رو نصب کردم.اما دستور enable-razorgenerator بدون دادن هیچ خطایی انجام می‌شود اما فایلهای  Cs مربوط به View‌ها تولید نمیشه و وقتی روشون Run Custom Tool رو می‌زنم این پیغام میاد.ممنون اگه راهنماییم کنید.

    • #
      ‫۱۰ سال و ۱۲ ماه قبل، سه‌شنبه ۱۶ مهر ۱۳۹۲، ساعت ۲۰:۴۸
      قسمت (ب) ابتدای بحث کافی نیست. قسمت (الف) توضیح داده شده نیز باید انجام شود.
  • #
    ‫۹ سال و ۵ ماه قبل، چهارشنبه ۲ اردیبهشت ۱۳۹۴، ساعت ۰۴:۴۶
    آیا بین این روش و portable area  تفاوتی هست؟
    • #
      ‫۹ سال و ۵ ماه قبل، چهارشنبه ۲ اردیبهشت ۱۳۹۴، ساعت ۰۵:۱۴
      - razor generator توسط اعضای تیم نیوگت و همچنین ASP.NET MVC تهیه شده.
      - razor generator برخلاف portable areas در زمان کامپایل کار parse و همچنین قرار دادن viewها را در DLL مرتبط انجام می‌دهد.
      - آخرین به روز رسانی portable areas در سال 2010 بوده، اما razor generator مدام به روز می‌شود.
  • #
    ‫۹ سال و ۲ ماه قبل، جمعه ۲۶ تیر ۱۳۹۴، ساعت ۰۴:۰۷
    تمام نکاتی را که فرمودید اعمال کردم ولی با این حال هلپر‌های موجود در App_Code قابل شناسایی نبودند و برای فضای نام MVC5.Web.App_Code  خطای یافت نشد اعلام میکرد . 
    هلپر‌ها را به فولدر دیگری انتقال دادم ولی بازم با وجود فضای نام مربوطه ، خطای 
     'ToastrBuilder' does not exist in the current context
    نشان داده میشود .

      • #
        ‫۹ سال و ۲ ماه قبل، جمعه ۲۶ تیر ۱۳۹۴، ساعت ۰۵:۵۷
        ممنون با اضافه کردن قسمت زیر  در اول فایل هلپر مشکل حل شد.
        @* Generator: MvcHelper
           GeneratePrettyNames: true *@
        Generator Types