عنوان:

‫ویرایش قالب پیش فرض Add View در ASP.NET MVC برای سازگار سازی آن با Twitter bootstrap


نویسنده: وحید نصیری
تاریخ: ۱۳۹۲/۰۳/۲۱ ۸:۰
آدرس: www.dntips.ir
همانطور که در مطلب «اعمال کلاس‌های ویژه اعتبارسنجی Twitter bootstrap به فرم‌های ASP.NET MVC» ملاحظه کردید، برای سازگار سازی یک فرم جدید ایجاد شده ASP.NET MVC با پیش فرض‌های Twitter bootstrap، حداقل 8 مرحله باید طی شود و ... چقدر خوب می‌شد اگر این‌کارها به صورت خودکار توسط VS.NET بجای قالب پیش فرض ایجاد فرم آن، تولید می‌شد. در ادامه قصد داریم این سفارشی سازی را انجام دهیم.


مراحل کلی سفارشی سازی قالب‌های Scaffolding پیش فرض ASP.NET MVC

قالب‌های Scaffolding پیش فرض ASP.NET در مسیر Microsoft Visual Studio X\Common7\IDE\ItemTemplates\CSharp\Web\MVC X\CodeTemplates قرار دارند. برای نمونه اگر بخواهیم پیش فرض‌های تولید فرم‌های MVC4 را تغییر دهیم، باید به پوشه MVC 4\CodeTemplates\AddView\CSHTML مراجعه و فایل Create.tt را ویرایش کنیم.
اینکار هرچند عملی است اما آنچنان جالب نیست؛ از این جهت که تاثیری کلی و سراسری خواهد داشت.
برای اعمال محلی این تغییرات فقط به یک پروژه خاص، تنها کافی است همین مسیر CodeTemplates\AddView\CSHTML به همراه تمام فایل‌های tt آن، در پوشه جاری پروژه مدنظر ما کپی شود. به این ترتیب ابتدا به این پوشه محلی مراجعه خواهد شد.
روش دوم کپی کردن این فایل‌ها، استفاده از بسته نیوگت ذیل است:
 PM> Install-Package Mvc4CodeTemplatesCSharp


سفارشی سازی فایل Create.tt پیش فرض ASP.NET MVC جهت سازگار سازی آن با Twitter bootstrap

در اینجا قصد داریم همان 8 مرحله مطلب «اعمال کلاس‌های ویژه اعتبارسنجی Twitter bootstrap به فرم‌های ASP.NET MVC» را به فایل Create.tt که اکنون در پوشه CodeTemplates\AddView\CSHTML\Create.tt ریشه پروژه جاری قرار دارد، اعمال کنیم.
الف) ابتدا نام این فایل را به CreateBootstrapForm.tt تغییر می‌دهیم. از این لحاظ که این نام جدید در drop down مرتبط با scaffold template صفحه Add view ظاهر خواهد شد. به علاوه نیازی نیست تا این فایل tt در همان لحظه اجرا شود، بنابراین به خواص آن در VS.NET مراجعه کرده و مقدار گزینه custom tool آن‌را خالی می‌کنیم (مانند سایر فایل‌های tt اضافه شده).
ب) قسمت ابتدایی فایل CreateBootstrapForm.tt را که همان کپی مطابق اصل فایل Create.tt است، به نحو ذیل تغییر می‌دهیم:
<#
    if (!mvcHost.IsContentPage) {
#>
<script src="~/Scripts/jquery-1.9.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

<#
    }
}
#>
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true, null, new { @class = "alert alert-error alert-block" })

    <fieldset class="form-horizontal">
        <legend><#= mvcHost.ViewDataType.Name #></legend>

<#
foreach (ModelProperty property in GetModelProperties(mvcHost.ViewDataType)) {
    if (!property.IsPrimaryKey && !property.IsReadOnly && property.Scaffold) {
#>
        <div class="control-group">
<#
        if (property.IsForeignKey) {
#>
            @Html.LabelFor(model => model.<#= property.Name #>, "<#= property.AssociationName #>",new {@class="control-label"})
<#
        } else {
#>
            @Html.LabelFor(model => model.<#= property.Name #>,new {@class="control-label"})
<#
        }
#>
        
           <div class="controls">
<#
        if (property.IsForeignKey) {
#>
            @Html.DropDownList("<#= property.Name #>", String.Empty)
<#
        } else {
#>
            @Html.EditorFor(model => model.<#= property.Name #>)
<#
        }
#>
            @Html.ValidationMessageFor(model => model.<#= property.Name #>,null,new{@class="help-inline"})
</div>
        </div>

<#
    }
}
#>
<div class="form-actions">
            <button type="submit" class="btn btn-primary">ارسال</button>
            <button class="btn">لغو</button>
          </div>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
<#
if(mvcHost.IsContentPage && mvcHost.ReferenceScriptLibraries) {
#>

@section JavaScript {    

}
که حاصل آن به صورت ذیل قابل استفاده و دسترسی خواهد بود:


دریافت فایل CreateBootstrapForm.tt اصلاح شده:
همانطور که عنوان شد، برای استفاده از آن فقط کافی است آن‌را در مسیر CodeTemplates\AddView\CSHTML\CreateBootstrapForm.tt ریشه پروژه جاری خود کپی کنید.

نظرات

  • محمد آزاد در ۱۳۹۲/۰۳/۲۹ ۱۳:۷
    برای ایجاد یک قالب دلخواه، من به یک مشکل خوردم. فرض کنید من مدلی به این شکل دارم 
     public class MyModel
        {
            public Person person { get; set; }
            public string Type{ get; set; }
        }
     public class Person 
       {
        Public string FirstName{get;set;}
        public string LastName{get;set;}
       }
    کدی که برای Create  توسط قالب ویژه من ایجاد میشه به این صورت هستش
    @model myModel
    
    @{
        ViewBag.Title = "View3";
    
    }
    
    <h2>View3</h2>
    
    
    @using (Ajax.BeginForm() {
    
    <section class="Simple Page">
    
           <div class="row-fluid">
                @Html.LabelFor(model => model.Type, new { @class = "span3" })
    
           <div class="input-control text span4">
    
                @Html.EditorFor(model => model.Type, new { @class = "span4 ", placeholder = Html.Encode("ResorceName") })
               </div>
    
            </div>
    
        </section>
    }
    • وحید نصیری در ۱۳۹۲/۰۳/۲۹ ۱۴:۸
      قالب پیش فرض Create از nested properties یا complex properties پشتیبانی نمی‌کند. (البته نه به این معنا که اگر دستی اضافه شوند کار نمی‌کند)
      + یک راه حل برای این نوع اشیاء توسط یکی از اعضای سابق تیم ASP.NET MVC
      و یا اگر نیاز به اطلاعات بیشتری داشتید، پروژه MvcScaffolding یک چنین روابطی رو پشتیبانی می‌کند: «MvcScaffolding: One-to-Many Relationships»
  • محمد صاحب در ۱۳۹۲/۱۲/۱۰ ۱۶:۵۶
    Compiling transformation: The type or namespace name 'MvcTextTemplateHost' could not be found (are you missing a using directive or an assembly reference?)
    دوستان اگه این ارور رو گرفتید با ریستارت کردن ویژوال استادیو ارور رفع میشه
  • محمد آزاد در ۱۳۹۳/۰۴/۱۴ ۱۶:۲
    سلام. من از vs2013 update 2 استفاده می‌کنم.اما مشکلی که دارم اینه تمپلیت جدید به لیست scaffold template  اضافه نمیشه؟خواستم بدونم تو این ورژن باید کار خاصی انجام بدم؟
    بعد از ایجاد تمپلیت جدید در دیالوگ AddView  اسم تمپلیتم رو نمیبینم. ساختار فولدر بندی در ریشه پروژم وجود داره CodeTemplates\AddView\CSHTML\MyCreate.tt

  • مهدی ملائیان در ۱۳۹۶/۰۹/۱۱ ۱۴:۱۷
    من مطلب فوق رو مرحله به مرحله انجام دادم ، 1 بار با استفاده از Nuget و یکبار هم با کپی دایرکتوری معرفی شده در پوشه CodeTemplates ولی View سفارشی من در بخش Template ظاهر نمی‌شود ، البته من از T4MVC در پروژه استفاده می‌کنم ، آیا نکته ای هست که باید لحاظ شود ؟ مواردی هم که در comment‌ها مطرح شده بود رو چک کردم ولی نتیجه ای نداشت
    اطلاعات پروژه : VS 2015 Update 2 و همچنین Asp.net mvc 5
    • وحید نصیری در ۱۳۹۶/۰۹/۱۱ ۱۵:۱
      PM> Install-Package Mvc5CodeTemplatesCSharp -Version 5.0.0