2012-05-16 4 views
3

Было несколько вопросов относительно шаблонов и дженериков mvc, но, похоже, ничто не связано с тем, что я ищу. Рассмотрим следующие модели:MVC3 Редактор бритвы/Шаблоны и генераторы шаблонов

namespace MyNamespace 
{ 
    public class ModelBase { /* Not important for example */ } 

    public class MyModel : ModelBase 
    { 
     public string Name { get; set; } 
    } 

    public class MyViewModel 
    { 
     public IEnumerable<ModelBase> Data { get; set; } 
    } 
} 

и контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index 
    { 
     return View(new MyViewModel { Data = new List<MyModel>() }) 
    } 
} 

бритвой посмотреть просмотров/Главная/Index.cshtml будет выглядеть так:

@model MyNamespace.MyViewModel 
@Html.EditorFor(m => m.Data) 

Ничего особенного там. Если мне нужен шаблон отображения или редактора, я могу создать файл в разделе Views/Shared/EditorTemplate или в разделе Views/Home/EditorTemplates под названием MyModel.cshtml и он найдет его правильно.

Что делать, если я хочу сделать что-то другое для каждой реализации ModelBase при показе списка? Mvc viewer найдет шаблон List'1.cshtml правильно в любом из указанных выше путей. Однако мне нужно сделать шаблон для List`1 [MyModel] .cshtml

Я не могу найти правильное имя файла. То, что я пытался до сих пор (по отношению к этому примеру именования):.

  • List`1 [MyModel] .cshtml
  • List`1 [[MyModel]] cshtml
  • List`1 [MyNamespace .MyModel] .cshtml
  • List`1 [[MyNamespace.MyModel]]. cshtml

Если это возможно, я хочу, чтобы избежать написания пользовательских видоискатель. Единственная альтернатива, о которой я могу сейчас думать, если я не могу получить выше работы для работы, - это просто, чтобы List`1.cshtml вызывал частичное с наименованием, выведенным из списка.

+0

В конце концов я сделал быстрые и грязные решения, где шаблон List'.cshtml обрабатывает весь список в Views \ Home. Он вручную компилирует имя шаблона из общего и содержащегося типа и вызывает это как частичное, передавая модель. Не гордитесь этим, а только решениями, о которых я могу думать. Любое предложение сделать это «правильно» приветствуется. Таким образом, я закончил с шаблонами с именем List' [MyModel] .cshtml и тому подобное. –

ответ

1

Я не проверял этот код, но я бы создавать различные представления для каждого подтипа и сделать что-то немое, как:

return View(MyModel.GetType().Name, new MyViewModel { Data = new List<MyModel>() }) 

Так что ваш взгляд совпадает с именем вашего типа.

+0

Да, вот почему я закончил, но внутри шаблона, так как Html.EditorFor или Html.DisplayFor вызывается из другого шаблона. –

0

Вы можете сделать это в главном окне:

@model MyViewModel 
@Html.EditorFor(x => x.Data) 

и затем:

  • ~/Views/Shared/EditorTemplates/MyModel.cshtml:

    @model MyModel 
    ... 
    
  • ~/Views/Shared/EditorTemplates/MyOtherModel.cshtml (где, очевидно MyOtherModel происходит от ModelBase) :

    @model MyOtherModel 
    ... 
    

и так далее ... ASP.NET MVC будет заботиться о перекручивание через свойство Data и выбрать правильный шаблон на основе типа выполнения каждого элемента этой коллекции.

+0

Это точно моя проблема :) Я не хочу, чтобы Mvc перебирал элементы. Я хочу иметь шаблон для каждой реализации ModelBase, который отправляется модели как List , а затем другой для списка , List . –

6

очень поздно ответ, полезно, если кто-то шишка в этом же самом вопросе (как и я сделал несколько минут назад, пытаясь вспомнить, как это сделать)

Вы можете использовать UIHintAttribute определить имя из editor

public class MyViewModel 
{ 
    [UIHint("MyModel")] 
    public IEnumerable<ModelBase> Data { get; set; } 
} 
Смежные вопросы