ProjectsとProjectsDataの2つのテーブルがあり、結合を使用してクエリを実行し、ビューで結果を取得します。
コントローラには次のコードがあります:
ViewBag.projectsData = (from pd in db.ProjectsData
join p in db.Projects on pd.ProjectId equals p.ID
where pd.UserName == this.HttpContext.User.Identity.Name
orderby p.Name, p.ProjectNo
select new { ProjectData = pd, Project = p });
このデータを抽出するためにビューで使用する必要があるもの。私はそれを試しました:
@foreach (var item in ViewBag.projectsData)
{
@item.pd.UserName
}
しかし、それは動作しません...
あなたの見解では、pd
プロパティにアクセスしようとしていますが、そのようなプロパティは存在しません。プロパティはProjectData
と呼ばれます。
これは、ViewBag
ではなく、ビューモデルと厳密に型指定されたビューを使用することを強くお勧めします。このようにすると、正しい名前を選択するのに役立つはずのビューにIntellisenseも表示されます。
したがって、ビューに必要なすべての情報を保持するビューモデルを定義することから始めることができます。
public class MyViewModel
{
public ProjectData ProjectData { get; set; }
public Project Project { get; set; }
}
次に、コントローラーアクション内でこのビューモデルを設定し、ビューに渡します。
public ActionResult Index()
{
var viewModel =
from pd in db.ProjectsData
join p in db.Projects on pd.ProjectId equals p.ID
where pd.UserName == this.HttpContext.User.Identity.Name
orderby p.Name, p.ProjectNo
select new MyViewModel { ProjectData = pd, Project = p };
return View(viewModel);
}
最後に、強く型付けされたビューの内部でビューモデルを使用します。
@model IEnumerable<AppName.Models.MyViewModel>
@foreach (var item in Model)
{
<div>@item.ProjectData.UserName</div>
}