簡體   English   中英

在強類型視圖中顯示來自多個表的數據

[英]display data form multiple tables in a strongly typed view

我有一個強類型視圖,它顯示數據庫表“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”表中的學生,然后將它們顯示在視圖中?

任何幫助深表感謝

您需要以“不可知”的方式存儲結果。 例如

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;

您可以使用兩者創建視圖模型

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);

我不得不為 Treeview 而不是 table 做類似的事情,並且需要組合兩個不同的集合以便從單個集合生成樹視圖。 在我的情況下,我能夠使用這個將它們結合起來......

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM