【问题标题】:How to provide a model to a nested view in MVC (Razor)如何在 MVC (Razor) 中为嵌套视图提供模型
【发布时间】:2015-08-19 15:32:05
【问题描述】:

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

这是一个例子。

我的索引控制器:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    例如

      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 Todo { public int ID { get; set; } public string Title { get; set; } } public class TodoDBContext : DbContext { public DbSet&lt;Todo&gt; Todos { get; set; } }
    • 如果我在 /create route 中运行应用程序,一切正常。我想要的是在其他视图中使用“创建”视图
    【解决方案2】:

    像这样简单地创建一个视图模型类:

    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)
    

    【讨论】:

    • 那样的话,我的目的就无法解决了。我想使用不同的模型,让我的应用更通用。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以创建一个 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)
      

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多