如何在MVC(Razor)中为嵌套视图提供模型

时间:2014-02-21 09:35:52

标签: asp.net-mvc asp.net-mvc-4 razor

假设我正在向页面(视图)渲染另一个页面(视图)。 现在,嵌套视图有其独立的模型。如何将模型提供给嵌套视图。

以下是示例。

我的索引控制器:

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

我的索引视图:

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

我的创建视图:

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

现在,如果我运行该程序,它会为创建视图提供一些模型类型不匹配错误。

那么,如何解决这个问题呢?如何从视图中为嵌套视图提供另一个模型?

4 个答案:

答案 0 :(得分: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)
  }

答案 1 :(得分: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)

答案 2 :(得分: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)

答案 3 :(得分:0)

视图中的视图或其他词语,就我与MVC的事情而言,nested view是不可行的。您可以创建视图并将其绑定到模型,以在浏览器上显示与该模型相关的数据。现在,如果您希望在视图上呈现来自其他多个模型/业务实体的数据,那么您可以使用ViewModels(Reference 1Reference 2),就此而言,上述答案仍然有效。您还可以自定义/在您的布局上定义sections以呈现特定信息。Partial views也会根据您要传递给视图的信息类型进行选择。