假设我正在向页面(视图)渲染另一个页面(视图)。 现在,嵌套视图有其独立的模型。如何将模型提供给嵌套视图。
以下是示例。
我的索引控制器:
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
现在,如果我运行该程序,它会为创建视图提供一些模型类型不匹配错误。
那么,如何解决这个问题呢?如何从视图中为嵌套视图提供另一个模型?
答案 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 1,Reference 2),就此而言,上述答案仍然有效。您还可以自定义/在您的布局上定义sections
以呈现特定信息。Partial views
也会根据您要传递给视图的信息类型进行选择。