假设我正在将另一个页面(视图)呈现为页面(视图)。现在,嵌套视图具有其单独的模型。如何将模型提供给嵌套视图。
下面是示例。
我的索引控制器:
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)