如何在 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)

我的创建视图:

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

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

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

在你的模型中,你将有一个单独的模型作为变量。

例如

  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)
  }

只需创建一个视图模型类,如下所示:

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)
视图

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

您可以创建主模型并将其引用到索引视图

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)

最新更新