3

我有一个强类型视图,它显示数据库表“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”表中的学生,然后在视图中显示它们?

任何帮助深表感谢

4

3 回答 3

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;
于 2012-11-13T18:27:08.040 回答
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);
于 2012-11-13T18:27:22.100 回答
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();
}
于 2012-11-13T18:38:59.350 回答