Шаблон MVC из папки, отличной от папки по умолчанию (EditorTemplates/DisplayTemplates)?

Можете ли вы указать MVC папку, отличную от папок по умолчанию (Views/Shared/EditorTemplates & Views/Shared/DisplayTemplates)? Я хотел бы либо поместить их в подпапки ниже этих, либо в другие папки за пределами общей папки.

Например, если у меня есть шаблон редактора в этой папке:

~\Views\Order\ProductModel.cshtml

Как я могу указать моему шаблону EditorFor использовать это имя шаблона?

Я попытался полностью квалифицировать его, но это не работает:

@Html.EditorFor(m => m.ProductModel, @"~\Views\Order\ProductModel.cshtml")

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


person Jerad Rose    schedule 20.10.2011    source источник


Ответы (3)


Нет, боюсь, вы не можете этого сделать.

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

Это больше не шаблон редактора. Это частично. Если вы хотите поделиться шаблонами редактора между разными контроллерами, вы можете просто поместить их в папку ~/Views/Shared/EditorTemplates.

Что касается подпапок, вы можете сделать это:

@Html.EditorFor(x => x.Foo, "Order/ProductModel")

который будет отображать шаблон редактора ~/Views/CurrentController/EditorTemplates/Order/ProductModel.cshtml или ~/Views/Shared/EditorTemplates/Order/ProductModel.cshtml.

person Darin Dimitrov    schedule 20.10.2011
comment
Это имеет смысл. Я не знал, что у вас могут быть папки Editor/DisplayTemplate под папкой представления контроллера. Это выполняет то, что я пытаюсь сделать. Спасибо Дарин. - person Jerad Rose; 21.10.2011
comment
Второй путь: ~/Views/Shared/EditorTemplates/Order/ProductModel.cshtml не найден для меня... есть подвох? - person Dmitry Efimenko; 31.07.2012
comment
На самом деле находит, но выдает ошибку: The model item passed into the dictionary is of type 'System.Collections.Generic.List``1[Whatever.Models.ProductModel]', but this dictionary requires a model item of type 'Whatever.Models.ProductModel'. - person Dmitry Efimenko; 31.07.2012
comment
в вашем примере Foo - это List<ProductModel> - person Dmitry Efimenko; 31.07.2012
comment
@Dmitry Смотрите здесь - stackoverflow.com/questions /5818351/. tldr — явно настраивая свой EditorFor на использование определенного шаблона редактора, вы говорите ему использовать этот шаблон редактора для всего перечисления вместо того, чтобы разрешать шаблонирование перечисляемого по умолчанию, в свою очередь, используя шаблон для каждого перечисляемого элемента - person Bookamp; 03.08.2012
comment
@Bookamp Я понимаю общую цель EditorTemplates и то, как они работают, и это то, что вы, кажется, пытаетесь мне объяснить. Единственная проблема, с которой я столкнулся, это наличие одного в подпапке папки EditorTemplates. По какой-то причине, когда я указываю использовать этот шаблон, он начинает требовать List<MyModel> вместо просто MyModel - person Dmitry Efimenko; 03.08.2012
comment
Привет @damin-dimitrov, Если я просматриваю файл вне приложения, как я могу продолжить? Я не смог прочитать файл. - person sam anderson; 24.08.2016

Старый вопрос, но... правильный способ добавить шаблон отображения/редактора для конкретного контроллера — добавить его в подпапку DisplayTemplates или EditorTemplates.

Предполагая, что в вашем примере у вас есть OrderController, вы можете просто поместить шаблон отображения для своей модели в подпапку, например:

~\Views\Order\DisplayTemplates\ProductModel.cshtml

Затем вызовите шаблон отображения, как обычно, из вашего представления (например, из `~\Views\Order\Index.cshtml):

@Html.DisplayFor(m => m.MyProductModelProperty)
person Nenad    schedule 18.05.2015
comment
Этот ответ лучше решает проблему наличия шаблонов редактора/отображения, когда они не имеют смысла для совместного использования, а скорее для содержания в определенном контроллере. Это позволяет избежать попыток повторного использования того, что иногда нельзя использовать повторно из соображений удобства обслуживания. Один голос за этот ответ. - person Reuel Ribeiro; 19.10.2017

Если вы сделаете это:

@Html.EditorFor(x => x.Foo, "Order/ProductModel")

он не будет анализировать Foo как коллекцию и применять шаблон редактора к каждому элементу. Это скорее предполагает, что ваш шаблон редактора должен быть применен к коллекции в целом.

Если вы хотите применить шаблон редактора к каждому элементу отдельно, просто поместите его в папку EditorTemplates в папке просмотра (поскольку он будет иметь приоритет) и используйте синтаксис по умолчанию:

@Html.EditorFor(x => x.Foo)

Разумеется, название шаблона редактора должно соответствовать типу элементов вашей коллекции.

person lukeguy    schedule 05.08.2012