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

単一のコントローラー アクションで、厳密に型指定されたビューで 2 つの異なるテーブルのデータを表示することは可能ですか? または、"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

テーブルではなくツリービューに対して同様のことを行う必要があり、1 つのコレクションからツリービューを生成するために 2 つの異なるコレクションを組み合わせる必要がありました。私の場合、これを使用してそれらを組み合わせることができました...

var allStudents = StudentA.Union((IEnumerable<Object>)StudentB);

次に、コレクション内の各オブジェクトを反復処理するときに、コードでオブジェクトのデータ型をテストし、さまざまなコードを使用してさまざまなタイプの学生をレンダリングする場合に必要な方法で表示できます。私の場合、子アイテムを持つノードは子アイテムのないノードとはまったく異なるタイプだったので、これを行う必要がありました。

Object を何らかの共有継承 (インターフェイスなど) の代わりにルート コレクション タイプとして使用すると、結合されたコレクションを並べ替えたり、それらをフィルター処理したりする方法がなくなることに注意してください。

2 つのコレクションを別のコレクションの末尾に追加するだけでなく、混合する必要がある場合は、ある種の共有継承を使用する必要があります。

更新

これが機能することを示すサンプル コード。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 に答える