1

MVC3 RazorのLINQを使用して、データベースから複数のテーブルを選択しようとしています。ビュー内の複数のテーブルから複数のデータを表示するには、コードに何を変更する必要がありますか?

これは私のモデルです

public class DailyAttendance
{
    [Key]
    public string pnp { get; set; }
    public string student_id { get; set; }
    public string mth_yr_id { get; set; }
    public string D01 { get; set; }
    public string D02 { get; set; }
} // and so on

public class TitasDb : DbContext
{
    public DbSet<DailyAttendance> DailyAttendance { get; set; }
    public DbSet<MonthYear> MonthYear { get; set; }
    // and so on

}


これが、コントローラーでLINQを使用する方法です。

public class AttendanceController : Controller
{
    TitasDb _attendanceModel = new TitasDb();

    public ActionResult Index()
    {
        var model = from s in _attendanceModel.Student
                    join ssc in _attendanceModel.StudentSchoolClass on s.student_id equals ssc.student_id
                    join sc in _attendanceModel.SchoolClass on ssc.school_class_id equals sc.school_class_id
                    join da in _attendanceModel.DailyAttendance on s.student_id equals da.student_id
                    join my in _attendanceModel.MonthYear on da.mth_yr_id equals my.mth_yr_id
                    where my.month_id == "M05"
                    where sc.teacher_id == "T1000001"
                    select new { DailyAttendance = da, Student = s };


        return View(model);
    }
}


そして、これは私がデータを見ようとした方法です

@model IEnumerable<titas.Models.DailyAttendance>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.student_id)
    <td>
</tr>
}


そして、私が得ているエラーは

The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[<>f__AnonymousType5`2[titas.Models.DailyAttendance,titas.Models.Student]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[titas.Models.DailyAttendance]'. 
4

3 に答える 3

7

すべての ASP.NET MVC アプリケーションと同様に、ビューで操作する必要があるすべての情報を含むビュー モデルを定義します。

public class MyViewModel
{
    public DailyAttendance DailyAttendance { get; set; }
    public Student Student { get; set; }
}

次に、コントローラー アクションでこのビュー モデルをビューに返します。

public class AttendanceController : Controller
{
    TitasDb _attendanceModel = new TitasDb();

    public ActionResult Index()
    {
        var model = from s in _attendanceModel.Student
                    join ssc in _attendanceModel.StudentSchoolClass on s.student_id equals ssc.student_id
                    join sc in _attendanceModel.SchoolClass on ssc.school_class_id equals sc.school_class_id
                    join da in _attendanceModel.DailyAttendance on s.student_id equals da.student_id
                    join my in _attendanceModel.MonthYear on da.mth_yr_id equals my.mth_yr_id
                    where my.month_id == "M05"
                    where sc.teacher_id == "T1000001"
                    select new MyViewModel
                    { 
                        DailyAttendance = da, 
                        Student = s 
                    };
        return View(model.ToList());
    }
}

最後に、ビュー モデルに強く型付けされたビューを作成します。

@model IList<MyViewModel>
<table>
    <thead>
        <tr>
            <th>student id</th>
            <th>attendance id</th>
        </tr>
    </thead>
    <tbody>
        @for (var i = 0; i < Model.Count; i++)
        {
            <tr>
                <td>@Html.DisplayFor(x => x[i].Student.student_id)</td>
                <td>@Html.DisplayFor(x => x[i].DailyAttendance.attendance_id)</td>
            </tr>
        }
    </tbody>
</table>

ビューをクリーンアップするには、モデルの各要素に対して自動的にレンダリングされる表示テンプレートを使用できます ( ~/Views/Shared/DisplayTemplates/MyViewModel.cshtml):

@model MyViewModel
<tr>
    <td>@Html.DisplayFor(x => x.Student.student_id)</td>
    <td>@Html.DisplayFor(x => x.DailyAttendance.attendance_id)</td>
</tr>

これで、メイン ビューは次のようになります。

@model IList<MyViewModel>
<table>
    <thead>
        <tr>
            <th>student id</th>
            <th>attendance id</th>
        </tr>
    </thead>
    <tbody>
        @Html.DisplayForModel()
    </tbody>
</table>
于 2012-05-04T06:37:37.887 に答える
1

ビューに匿名オブジェクトを送信し、ビューが取得されることを宣言していますがIEnumerable<titas.Models.DailyAttendance>、これはこの状況では当てはまりません。そのためのモデルを作ってみてください。

public class MyModel
{
   public DailyAttendance dailyAttendance{ get; set; }
   public Student student { get; set; }
}

次に、コントローラーでこのモデルにデータを入力します

    var model = (from s in _attendanceModel.Student
                join ssc in _attendanceModel.StudentSchoolClass on s.student_id equals ssc.student_id
                join sc in _attendanceModel.SchoolClass on ssc.school_class_id equals sc.school_class_id
                join da in _attendanceModel.DailyAttendance on s.student_id equals da.student_id
                join my in _attendanceModel.MonthYear on da.mth_yr_id equals my.mth_yr_id
                where my.month_id == "M05"
                where sc.teacher_id == "T1000001"
                select new MyModel { dailyAttendance = da, student = s }).ToList();

そして、それをビューに渡し、ビューのモデルを次のように宣言します

@model IEnumarable<MyModel>
于 2012-05-04T06:37:58.613 に答える
0

問題は、モデルとして匿名タイプを渡していることです。select new { DailyAttendance = da, Student = s }ここで、ビューでモデルをとして定義しています@model IEnumerable<titas.Models.DailyAttendance>

ビューに固有のモデルを作成してみてください。

public class AttendanceModel
{
    public Student Student { get; set; }
    public DailyAttendance DailyAttendace { get; set; }
}

またはあなたのために働くものは何でも。学生や毎日の出席者向けに特定のビューモデルを作成することもできます。

次に、モデルを変更できます。

@model IEnumerable<Attendanceodel>

そして、以下を選択します。

select new AttendanceModel { DailyAttendance = da, Student = s }

それがあなたを正しい軌道に乗せることを願っています。

于 2012-05-04T06:39:16.357 に答える