Как я могу отладить файл текстового шаблона mvc scaffolding?

Я добавляю пользовательский файл лесов как CustomCreate.tt. В диалоговом окне добавления представления mvc, когда я выбираю свой пользовательский шаблон в диалоговом окне, у меня возникает ошибка. Как я могу отлаживать свой текстовый файл шаблона?


person M.Azad    schedule 09.07.2014    source источник


Ответы (1)


Если вы используете версию Visual Studio ‹ VS 2012

Вы можете попробовать следующее:

  1. Включите пространство имен System.Diagnostics в файл .tt (<#@ import namespace="System.Diagnostics" #>)
  2. Поместите try-catch вокруг кода, который вы пытаетесь сгенерировать, и выведите все исключения в Trace.TraceError
  3. Если при запуске шаблона возникает ошибка, сведения об ошибке должны появиться в окне консоли Visual Studio.

В качестве примера вы можете посмотреть на следующее:

<#@ template language="C#" HostSpecific="True" #>
<#@ output extension="cs" #>
<#@ import namespace="System" #>
<#@ parameter type="System.String" name="ControllerName" #>
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="Namespace" #>
<#@ parameter type="System.String" name="AreaName" #>
<#@ import namespace="System.Diagnostics" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
<#        try{  #>
namespace <#=            Namespace #>
{
    public class <#=            ControllerName #> : Controller
    {
        //
        // GET: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/
        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Details/5
        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Create
        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Create
        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Edit/5
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Edit/5
        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Delete/5
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: <#=            (!String.IsNullOrEmpty(AreaName)) ? ("/" + AreaName) : String.Empty #>/<#=            ControllerRootName #>/Delete/5
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}

<# }
    catch(Exception e)
    {
        Trace.TraceError(e.ToString());
        throw;
    }
#>

Обратите внимание, что блок try-catch окружает весь код шаблона для класса.

Если вы используете версию Visual Studio ›= VS 2012

Лучший способ отладки шаблона T4 — добавить точки останова, как в обычном коде CSharp и VB. Чтобы запустить отладчик в шаблоне T4, просто щелкните его правой кнопкой мыши в обозревателе решений и выберите Отладить шаблон T4 в контекстном меню.

Следующая статья также поможет вам решить распространенные проблемы T4: Отладка текстового шаблона T4.

Обратите внимание, что это доступно только для VS2012 и выше. Таким образом, первый упомянутый мной метод подойдет разработчикам, использующим более старые версии Visual Studio.

person CShark    schedule 09.07.2014
comment
когда я получил ошибку при создании пользовательского представления. Страница ошибки показывает мне исключение ... Я хочу установить точку останова в моем CustomCreate.tt и проверить мои коды - person M.Azad; 09.07.2014
comment
@ M.Azad См. обновленный ответ. То, что вы хотите сделать, возможно только в Visual Studio 2012 или более поздней версии. Если вы используете более старую версию, я бы посоветовал вам использовать Trace.TraceInformation для отображения значения переменных в определенных точках вашего кода. - person CShark; 09.07.2014
comment
@ M.Azad Удалось ли вам отладить шаблон T4? - person CShark; 10.07.2014