2011-02-02 4 views
2

Я заметил это, когда я использовал следующие на мой взгляд:T4MVC не поддерживает DisplayTemplates и EditorTemplates

<% Html.RenderPartial(MVC.Shared.Views.EditorTemplates.ClientOnDocuments); %> 

Линия выше возвращает только имя точки зрения, так что в этом случае ClientOnDocuments. Затем движок просмотра по умолчанию запускает и пытается найти ClientOnDocuments.ascx в папке текущего вида и в общей папке, но не в папке DisplayTemplates и EditorTemplates.

Поскольку я довольно далеко от использования T4MVC, я не хочу сбрасывать его или смешивать разные стили реферирующих представлений (например, вышеописанное работает, если мы предоставляем путь к шаблону).

Причина заключается в том, что этот код T4MVC генерирует:

public class ViewNames { 
    ... 
     public readonly string FirmHeader = "~/Views/Shared/FirmHeader.ascx"; 
     public readonly string PostsSelector = "~/Views/Shared/PostsSelector.ascx"; 
     static readonly _DisplayTemplates s_DisplayTemplates = new _DisplayTemplates(); 
     public _DisplayTemplates DisplayTemplates { get { return s_DisplayTemplates; } } 
     public partial class _DisplayTemplates{ 
      public readonly string ClientOnDocuments = "ClientOnDocuments"; 
      public readonly string DateTime = "DateTime"; 
     } 
     static readonly _EditorTemplates s_EditorTemplates = new _EditorTemplates(); 
     public _EditorTemplates EditorTemplates { get { return s_EditorTemplates; } } 
     public partial class _EditorTemplates{ 
      public readonly string ClientOnDocuments = "ClientOnDocuments"; 
      public readonly string DateTime = "DateTime"; 
      public readonly string PostCode = "PostCode"; 
     } 

Вы можете видеть, что с точки зрения содержащейся в общей корневой все нормально, но, видимо, он не обрабатывает вложенные папки хорошо.

Я знаю, что могу изменить файл шаблона T4MVC, но на самом деле хотел бы получить ответ от David Ebbo о том, собирается ли он изменить/исправить это.

Надеюсь, он следует за этим, по крайней мере, я видел его здесь в декабре.

+1

Что было бы лучше, это иметь два класса: ViewNames (которые будут содержать только имена представлений) и ViewPaths, которые будут содержать пути, таким образом мы получим доступ к строго типизированным именам и путям. – mare

ответ

4

Интересно, что это другое поведение было введено намеренно после того, как другой пользователь столкнулся с проблемами. Посмотрите на это в T4MVC.settings.t4:

// Views in DisplayTemplates and EditorTemplates folders shouldn't be fully qualifed as it breaks 
// the templated helper code 
readonly string[] NonQualifiedViewFolders = new string[] { 
    "DisplayTemplates", 
    "EditorTemplates" 
}; 

Так нормально, вложенные папки получить полные пути, а только те два не делает.

Я думаю, что разница заключалась в том, что этот пользователь вызывал DisplayFor/EditorFor, чтобы отображать их, пока вы вызываете RenderPartial.

В любом случае, так как это в файле настроек, а не основном шаблон, вы можете просто изменить список, если вы не хотите это поведения, т.е.

readonly string[] NonQualifiedViewFolders = new string[] { }; 

Надеется, что это помогает! :)

+0

совершенный, Давид. – mare

+0

Итак, используя это, вы можете обратиться к пути представления через T4MVC, но тогда DisplayFor/EditorFor не сможет найти точки зрения, правильно? Слишком плохо, поскольку есть одно представление DisplayTemplates, которое я использую как через DisplayFor, так и в PartialViewResult (в разных контекстах). Полагаю, мне нужно будет выписать квалифицированный путь в виде строки в контроллере, если я хочу продолжить использовать DisplayFor. – adamjford

+0

Для DisplayTemplates и EditorTemplates мы могли бы не просто добавлять новые свойства для полного пути, а другие для ожидаемого поведения? – PBo