我有一个强类型视图,显示来自数据库表“Student_A”
的学生查看:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Student.Models.Student_A>>" %>
<table>
<% foreach (var item in Model) { %>
<tr>
<td>
<%= Html.Encode(item.StudentName) %>
</td>
<td>
<%= Html.Encode(item.StudentId) %>
</td>
</tr>
<% } %>
</table>
控制器:
public ActionResult ShowStudents()
{
ViewData.Model = stud.Student_A.Where(a => a.StudentId != 0);
return View();
}
我还有另一张桌子“Student_B”,它也存放了学生,我想在我的视野中展示这些学生。类似的东西:
public ActionResult ShowAllStudents()
{
var StudentA = stud.Student_A.Where(a => a.StudentId != 0);
var StudentB = stud.Student_B.Where(a => a.StudentId != 0);
ViewData.Model = StudentA + StudentB;
return View();
}
是否可以在单个控制器操作中的强类型视图中显示来自两个不同表的数据?或者我是否必须创建一个数据库视图,显示来自“Student_A”和“Student_B”表的学生,然后在视图中显示它们?
非常感谢任何帮助
答案 0 :(得分:2)
您需要以“不可知”的方式存储结果。例如
public class StudentInfo
{
public string Type { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
...
}
var students = stud.Student_A.Where(...).Select(a => new StudentInfo { Type = "Student_A", FirstName = a.FirstName, LastName = a.LastName });
students.concat( stud.Student_B.Where(...).Select(b => new StudentInfo { Type = "Student_B", FirstName = b.FirstName, LastName = b.LastName });
ViewData.Model = students;
return View();
通过这样做,您可以使用一个共同的学生信息类来存储可用作强类型模型的公共属性。
或者,如果要单独列出它们,可以创建复合ViewModel
public class StudentsVM
{
public IEnumerable<Student_A> Student_A { get; set; }
public IEnumerable<Student_B> Student_B { get; set; }
}
var vm = new StudentsVM;
vm.Student_A = stud.Student_A.Where(...);
vm.Student_B = stud.STudent_B.Where(...);
ViewData.Model = vm;
答案 1 :(得分:1)
您可以使用
创建视图模型public class StudentsViewModel
{
public List<Student.Models.Student_A> StudentsA {get;set}
public List<Student.Models.Student_B> StudentsA {get;set}
}
并在您的视图中返回此内容,如果A和B学生确实有不同的字段
var viewModel = new StudentsViewModel();
viewModel.StudentsA = stud.Student_A.Where(a => a.StudentId != 0);
viewModel.StudentsB = stud.Student_B.Where(a => a.StudentId != 0);
return View(viewModel);
答案 2 :(得分:0)
我必须为Treeview而不是表做类似的事情,并且需要组合两个不同的集合以便从单个集合生成树视图。在我的情况下,我能够使用它来组合它们......
var allStudents = StudentA.Union((IEnumerable<Object>)StudentB);
然后在代码中,当您遍历集合中的每个对象时,您可以测试对象的数据类型并以您希望的方式显示它,以防您想使用不同的代码来呈现不同类型的学生。我需要这样做,因为在我的情况下,具有子项的节点与没有子项的节点完全不同。
请注意,通过使用Object作为根集合类型而不是某种共享继承(例如接口),您将无法对组合集合进行排序或过滤它们。
如果你需要混合两个集合而不是仅仅将一个集合添加到另一个集合的末尾,那么你将不得不使用某种共享继承。
<强>更新强>:
示例代码显示这是有效的。我在LinqPad进行了测试,但我确信它在Visual Studio中也能正常工作。
public class Student_A
{
public int Id{get;set;}
public string FirstName{get;set;}
public string LastName{get;set;}
}
public class Student_B
{
public int Id{get;set;}
public string FirstName{get;set;}
public string MiddleName{get;set;}
public string LastName{get;set;}
}
void Main()
{
List<Student_A> StudentAs = new List<Student_A>();
StudentAs.Add(new Student_A(){Id = 1, FirstName = "Jack", LastName = "Smith"});
StudentAs.Add(new Student_A(){Id = 3, FirstName = "Sarah", LastName = "Jane"});
StudentAs.Add(new Student_A(){Id = 7, FirstName = "Zack", LastName = "Hall"});
List<Student_B> StudentBs = new List<Student_B>();
StudentBs.Add(new Student_B(){Id = 2, FirstName = "Jane", MiddleName = "T.", LastName = "Kelly"});
StudentBs.Add(new Student_B(){Id = 9, FirstName = "Rose", MiddleName = "Marie", LastName = "Tyler"});
StudentBs.Add(new Student_B(){Id = 4, FirstName = "Bobby", MiddleName = "Stephen", LastName = "Singer"});
var result = StudentAs.Union((IEnumerable<Object>)StudentBs);
result.Dump();
}