2014-02-21 6 views
2

Предположим, что я просматриваю другую страницу (просмотр) на страницу (просмотр). Теперь вложенный вид имеет свою отдельную модель. Как обеспечить модель для вложенного представления.Как предоставить модель вложенному представлению в MVC (Razor)

Вот пример.

мой индекс контроллера:

public ActionResult Index() 
     { 
      ViewBag.CreateModel = new Todo(); 
      return View(db.Todos.ToList()); 
     } 

мой индекс Вид:

IEnumerable<ToDoMVC.Models.Todo> 
@RenderPage("~/Views/Todo/Create.cshtml",ViewBag.CreateModel) 

Мои Create View:

@model ToDoMVC.Models.Todo 
// does operations with this model 

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

Итак, как это решить? Как предоставить другую модель для вложенного представления из представления?

ответ

0

В вашей модели у вас будет отдельная модель в качестве переменной.

Например

class Todo { 
     public CreateModel create {get;set} 
    } 

Затем, когда вы проходите через ко второму мнению вы могли бы сделать что-то вроде этого:

@RenderPage("~/Views/Todo/Create.cshtml",Model.create) 

Это будет проходить мимо второй модели к вашей создания страницы

Редакция

Перечитайте свой вопрос.

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

Так что вам нужно тоже через цикл модели, как это:

foreach(var item in Model) 
    { 
     @RenderPage("~/Views/Todo/Create.cshtml", item) 
    } 
+0

Моя модель похожа:. 'общественного класса Todo { общественного ИНТ ID {получить; набор;} строка Название общественности {get; set;} } общественный класс TodoDBContext: DbContext { pub lic DbSet Todos {get; задавать; } } ' –

+0

И если я запускаю приложение в/create route, все работает отлично. Я хочу использовать представление «create» внутри какого-либо другого представления. –

0

Просто создать класс вид модели, как это:

public class ToDoViewModel 
{ 
    public IEnumerable<ToDo> Todos{ get; set; } 
    public ToDo NewToDoItem { get; set; } 
} 

Затем измените действие вашего регулятора, в:

public ActionResult Index() 
{ 
    var todoViewModel = new ToDoViewModel(); 
    todoViewModel.NewToDoItem = new Todo(); 
    todoViewModel.Todos= db.Todos.ToList(); 
    return View(todoViewModel); 
} 

А затем измените Индекс:

@model ToDoMVC.Models.ToDoViewModel 
@RenderPage("~/Views/Todo/Create.cshtml",Model.NewToDoItem) 
+0

В этом случае моя цель не будет решена. Я хочу использовать разные модели, чтобы сделать мое приложение более универсальным. –

0

Вы можете создать MasterModel и передать его индексном

public Class MasterModel 
{ 
    Public IEnumerable<ToDo> TodoList { get; set; } 
    Public ToDo CreateModel { get; set; } 
} 

Контроллер

public ActionResult Index() 
{ 
     MasterModel model = new MasterModel(); 
     model.CreateModel = new Todo(); 
     model.TodoList = db.Todos.ToList(); 
     return View(model); 
} 

см это индекс модели

@model MasterModel 
@RenderPage("~/Views/Todo/Create.cshtml",Model.CreateModel) 
0

А вид внутри вида или inother слова, nested view не является жизнеспособным, поскольку мое дело с MVC идет. Вы создаете представление и привязываете его к модели для отображения данных, относящихся к этой модели в браузере. Теперь, если вы хотите, чтобы данные из других нескольких моделей/бизнес-объектов отображались в представлении, вы используете ViewModels (Reference 1, Reference 2) и, если на то пошло, ответы выше остаются в силе. Вы также можете настроить/определить sections на своем макете для визуализации конкретных . информация как хорошо Partial views также сделать вариант в зависимости от вида информации, которые вы хотите доставлены к просмотру