【问题标题】:Join two models to get data into a view加入两个模型以将数据放入视图
【发布时间】:2014-02-14 07:04:41
【问题描述】:

完整的 MVC Noob 警告。(2 小时学习时间)

我在网上查看了很多 MVC3 示例,但我还没有找到一个简单的示例来做我想做的事情。

我想要做的是两个连接两个模型并将一些数据放入一个视图中。最明显的

  public partial class Model1
    {
        public int ID { get; set; }
        public int StudentID { get; set; }
        public int CoachID { get; set; }
        public String StudentName {get;set;}

}



public partial class Model2
    {
        public int CoachID { get; set; }
        public String CoachName { get; set; }
}

在我看来,基本上我只需在 CoachID 上加入模型 1 和模型 2 并打印 网格中的 StudentName 和 CoachName。

  1. 我该怎么做?如何为此创建视图模型?

  2. 如何遍历视图并打印连接的数据?

  3. 我可以改为在数据库中创建一个视图并直接将模型和视图附加到它吗?

听起来很简单,但我在网上花了最后三个小时完全困惑

【问题讨论】:

  • 你为什么感到困惑?分开的概念。你到底想要什么?数据库模型加入?还是 ViewModel 加入?在哪个逻辑阶段?你想在视图中使用一些模型吗?加入模型也可以在控制器中完成!

标签: c# asp.net asp.net-mvc-3


【解决方案1】:
  1. 创建一个 StudentCoachViewModel,其中包含您在其中显示所需的属性,仅此而已。

  2. 在您的控制器中填充此视图模型的列表并将其发送到您的视图。代码示例很快就会跟进。

  3. 在您的视图中枚举该列表


public class StudentCoachViewModel
{
   public string CoachName { get; set; }
   public string StudentName { get;set; }
}

在您的控制器中,按照以下几行进行操作(只需输入此内容,尚未检查编译器)

public ActionResult Index()
{

  //code to populate your model1 and model2 already assumed

  var viewModels = (from m in model1List
                 join r in model2List on m.CoachId equals r.CoachId 
                 select new StudentCoachViewModel(){ StudentName=m.StudentName, 
                          CoachName = r.CoachName }).ToList();

  return View(viewModels);
}

在您看来,类似于(显然您希望格式化并使用可以由 Visual Studio 自动生成的正确布局、表格等)

@model IEnumerable<StudentCoachViewModel>
//other html content here

@foreach(var viewModel in Model)
{
   @Html.DisplayFor(o=>o.CoachName)   @Html.DisplayFor(o=>o.StudentName)
}

现在,如果您只想要一个而不是列表,那就更容易了

public ActionResult Index(int id)
{
  //code to load model1 and model2 already assumed to be in place. also assuming you loaded this data from a database by the id field being passed into this method.
  return View(new StudentCoachViewModel(){ StudentName = model1.StudentName, CoachName = model2.CoachName});
}

然后视图就变得简单了

@model StudentCoachViewModel
//other html here, h1, divs, etc whatever is in your view as html content.
@Html.EditorForModel()
or if you like to display each one instead of the above one line call:
@Html.LabelFor(o=>o.CoachName)
@Html.EditorFor(o=>o.CoachName)

【讨论】:

  • 感谢您的回答 - 填充模型 1 和模型 2 的代码已经假设了 - 请您详细说明一下。
  • 我假设您已经将数据库中的数据加载到模型 1 和模型 2 中,在这种情况下,我假设的所有记录都加载到模型 1 列表和模型 2 列表中。如果这只是为了显示单个记录,请参阅我刚刚添加的编辑
  • 谢谢!这应该有效。有没有办法扩展网格中的行以显示更多数据?你知道这是怎么回事吗,我可以在这里提出一个单独的问题并发布链接
  • 你能看看这个后续问题吗:stackoverflow.com/questions/21807416/…
【解决方案2】:

试试这个

public partial class Model3{
   public Model1 model1{get;set;}
   public Model2 model2{get;set;}
}

Model3 绑定到视图中。

【讨论】:

  • 感谢您的回答!像在其他答案中那样使用 View 模型会更好吗?
  • 像这样的复合类 1. 在这种情况下不需要 partial 2. 通过在不需要时将整个模型转储到视图中,您会面临向其中注入过多信息的风险一个视图(例如 Html.EditorForModel 可能暴露太多,需要验证您不打算在回发时进行验证等。最好只保留您绝对需要的信息。从架构的角度来看,这是 MVC 最佳实践. 当您开始在视图中使用超过所需的“完整”实体/类时,当您超出几个基本字段时,很快就会出现复杂情况。
  • @Amit 你能告诉我这些是什么类型的财产吗?我的意思是引用另一个类/模型的属性
【解决方案3】:

查看页面只能接受一个模型,所以不能同时传递两个模型, 所以你必须用这两个模型的所有成员创建另一个模型...... 然后在控制器中,您应该将这两个模型转换为一个模型并在新模型一的帮助下将其传递给查看

否则您可以使用这两个模型创建另一个新模型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多