从视图内循环调用查询方法

Call Query Method From Loop Within View

我对使用 ASP.NET MVC 还比较陌生,所以如果我在这里忽略了一些简单的事情,请原谅我的无知,但经过大量研究后,我仍然没有找到可靠的解决方案。

我正在将我的控制器中的项目列表传递到我的类型视图中:IEnumerable 项目:

IEnumerable<Project> Projects = ViewBag.Projects;

然后遍历每个项目并用信息填充数据表。唯一的麻烦是获取数据表中两列的数据,我需要从循环内进行第二个数据库查询。

我创建了一个@functions 部分来调用我存储库中的一个方法,该方法应该return 与任何特定项目相关的档案列表:

查看顶部

@using stwintranet.Areas.PQP.Models
@model Year

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    IEnumerable<Project> Projects = ViewBag.Projects;
    IEnumerable<Year> Years = ViewBag.Years;
    String year = ViewBag.URLYear;
} 
@functions
{
    private readonly IArchive_ElectronicRepository Archive_ElectronicRepository;

    public IEnumerable<Archive_Electronic> GetListArchives(int pid)
    {
        return Archive_ElectronicRepository.GetListArchives(pid);
    }
} 

查看主要内容:

<table id="dt_basic" class="table table-striped table-bordered table-hover" width="100%">
    <thead>
        <tr>
            <th>Project Year</th>
            <th>Project Number</th>
            <th>Project Title</th>
            <th>Client</th>
            <th>Site Address</th>
            <th>Director</th>
            <th>Archive Status</th>
            <th>Primary Location</th>
            <th>Location</th> <!-- Requires 2nd Query -->
            <th>Documents</th> <!-- Requires 2nd Query -->
        </tr>
    </thead>
    <tbody>
        @foreach (var project in Projects)
        {
            //Get a list of archived projects
            IEnumerable<Archive_Electronic> ArchiveProjects = GetListArchives(project.ProjectID);
            string Docs = "";
            string Locs = "";
            foreach (var archive in ArchiveProjects)
            {
                //Write List of Docs
                if (archive.DocumentType == 1)
                {
                    Docs = Docs + "Dwg ";
                }
                else if (archive.DocumentType == 2)
                {
                    Docs = Docs + "Doc ";
                }
                else if (archive.DocumentType == 3)
                {
                    Docs = Docs + "Eml ";
                }
                //Write List of Locations
                if (archive.Location == 2)
                {
                    Locs = Locs + "Dub ";
                }
                else if (archive.Location == 3)
                {
                    Locs = Locs + "Gal ";
                }
                else if (archive.Location == 4)
                {
                    Locs = Locs + "Lon ";
                }
                else if (archive.Location == 6)
                {
                    Locs = Locs + "Cor ";
                }
            }


            <tr id="@project.ProjectNumber" onclick="showProject(this.id)">
                <td>@project.Year</td>
                <td>@project.ProjectNumber</td>
                <td>@project.ProjectTitle</td>                                  
                <td>@project.Organisation.Organisation1</td>
                <td>@project.SiteAddress1</td>
                <td>@project.ProjectDirector</td>
                <td>Archive Status will go here</td>
                <td>@project.SiteArea</td>
                <td>@Locs</td>
                <td>@Docs</td>
            </tr>

        }


    </tbody>
</table>

存储库中的方法:

public IEnumerable<Archive_Electronic> GetListArchives(int id)
{
    return context.Archive_Electronic.Where(x => x.Project == id).DefaultIfEmpty();
}

控制器:

// GET: PQP/Stage9/ElectronicArchiveReport
public ActionResult ElectronicArchiveReport(string id)
{
    ViewBag.Years = YearRepository.GetYears();
    ViewBag.Projects = ProjectRepository.GetListProjects(id);
    ViewBag.URLYear = id;
    return View();
}

按原样使用此代码我得到:

System.NullReferenceException: Object reference not set to an instance of an object.

对于 return 位于视图中:

return Archive_ElectronicRepository.GetListArchives(pid);

位于@functions 中,我知道你很可能不应该像这样调用数据库,这可能就是我收到空异常错误的原因,但我在这里不知所措,无法真正找到合适的这样做的方式。

您的 private readonly IArchive_ElectronicRepository Archive_ElectronicRepository; 似乎没有被实例化或分配,这导致 NullReferenceException