Проблема с использованием списка для заполнения таблицы в представлении MVC 5

У меня есть следующий код в моем контроллере:

public ActionResult Index(int Id)
    {
        Landbase _db = new Landbase();

        OwnerWorkingInterests workingInterests = new OwnerWorkingInterests();

        //Owner owner = new Owner();



        var query = (from wg in _db.WorkingInterestGroups
            join wi in _db.WorkingInterests on wg.Id equals wi.WorkingInterestGroupId
            join l in _db.Leases on wg.LeaseId equals l.Id
            where wi.OwnerId.Equals(Id)
            select new OwnerWorkingInterests()
            {
                LeaseId = l.Id,
                WorkingInterestAmount = wi.WorkingInterestAmount,
                WorkingInterestGroupName = wg.Name,
                ClientAlias = l.ClientAlias,
                Lessor = l.Lessor,
                Lessee = l.Lessee,
                VolDocNumber = l.VolumeDocumentNumber,
                County = l.County,
                District = l.District
            }).ToList();

        //List<string> OwnerWorkingInterest = query.ToList<string>();

        return View(query);
    }

У меня есть следующий код, на мой взгляд:

        <div id="OwnerWorkingInterests" class="tab-pane fade">
        <h3>Working Interests</h3>
        <table class="table">
            <thead>
                <tr>
                    <td>Lease Id:</td>
                    <td>Working Int:</td>
                    <td>WI Group Name:</td>
                    <td>Alias:</td>
                    <td>Lessor:</td>
                    <td>Lessee:</td>
                    <td>VolPg:</td>
                    <td>County:</td>
                    <td>District0:</td>
                </tr>
            </thead>
            <tbody>
            @foreach (var owi in OwnerWorkingInterests)
            {
                <tr>
                    <td>@owi.LeaseId</td>
                    <td>@owi.WorkingInterestAmount</td>
                    <td>@owi.WorkingInterestGroupName</td>
                    <td>@owi.ClientAlias</td>
                    <td>@owi.Lessor</td>
                    <td>@owi.Lessee</td>
                    <td>@owi.VolDocNumber</td>
                    <td>@owi.County</td>
                    <td>@owi.District</td>
                </tr>
            }
            </tbody>
        </table>
    </div>

Я думал, что это заполнит таблицу правильной информацией

Это модель просмотра:

namespace LandPortal.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;

public partial class WorkingInterest
{
    public int Id { get; set; }

    public int? OwnerId { get; set; }

    [Column("WorkingInterest")]
    public decimal? WorkingInterestAmount { get; set; }

    [StringLength(45)]
    public string CreateUser { get; set; }

    [StringLength(45)]
    public string ModifyUser { get; set; }

    public Guid? CreateUserId { get; set; }

    public Guid? ModifyUserId { get; set; }

    public DateTime? CreateDate { get; set; }

    public DateTime? ModifyDate { get; set; }

    public int? WorkingInterestGroupId { get; set; }

    public WorkingInterestGroup WorkingInterestGroup { get; set; }

    public decimal? ORRI { get; set; }

    public int? ORRIOwnerId { get; set; }

    public virtual Owner Owner { get; set; }


}

}

Итак, что происходит, когда я запускаю его в отладчике, выдает очень расплывчатую ошибку. Буквально просто написано Ошибка: при обработке вашего запроса произошла ошибка. Итак, я предполагаю, что список заполняется, но не работает в foreach в представлении. Я могу ошибаться в этот момент.

Вот директивы модели для представления

@using LandPortal.Models
@using LandPortal.ViewModels
@using Microsoft.Ajax.Utilities
@model LandPortal.Models.Owner

person Max    schedule 02.08.2018    source источник
comment
foreach ссылается на переменную OwnerWorkingInterests. Где определяется эта переменная? Я не вижу его в модели.   -  person Nikki9696    schedule 02.08.2018
comment
OwnerWorkingInterests — это ViewModel, в которой хранится результат запроса linq.   -  person Max    schedule 02.08.2018
comment
Знает ли это ваш компилятор? Возможно, вы получаете ошибку компиляции по запросу, и поэтому вы видите свое общее исключение.   -  person Nikki9696    schedule 02.08.2018
comment
Честно говоря, я не знаю, я довольно зеленый с linq.   -  person Max    schedule 02.08.2018
comment
Хорошо, вы должны определить сильную модель и привязаться к ней, а не возвращать динамический объект. Его намного проще отлаживать. Как выглядит директива модели вашего представления?   -  person Nikki9696    schedule 02.08.2018
comment
Так должен ли я вместо этого использовать частичное представление? Оператор foreach является частью представления, которое уже имеет строго типизированную модель.   -  person Max    schedule 02.08.2018
comment
Извините, я пропустил вторую половину вопроса. Я добавил это к исходному вопросу   -  person Max    schedule 02.08.2018
comment
Итак, если ваше представление ожидает модель владельца, но ваш запрос не возвращает ее, это ваша проблема. Я опубликую небольшой пример через несколько.   -  person Nikki9696    schedule 02.08.2018


Ответы (1)


Если представление ожидает модель типа LandPortal.Models.Owner, а Index возвращает весь ActionResult, то Index должен вернуть модель этого типа.

Крошечный пример:

public ActionResult Index(int Id)
{
    Landbase _db = new Landbase();
    Owner owner = new Owner();

    // some query has to set properties on this owner object
    // let's pretend there's a property named OwnerWorkingInterests on it

    owner.OwnerWorkingInterests = query.ToList();  // you will have to define "query" and set it similar to how you already did

    return View(owner);
}

Теперь ваше представление может получить доступ к свойству модели как таковому.

@foreach (var owi in Model.OwnerWorkingInterests)

Это пример очень высокого уровня, но я вижу, что у вас есть частичный класс и вы упомянули частичные представления в своем комментарии. Если у вас большое представление и вы пытаетесь разбить запрос на части, это можно сделать с помощью PartialViewResult, и это будет немного отличаться от этого.

person Nikki9696    schedule 02.08.2018
comment
Итак, в основном мне нужно добавить ICollection к моей модели владельца? Чтобы правильно ссылаться на модель представления WorkingInterest - person Max; 02.08.2018
comment
Да, если у вас еще нет свойства коллекции, которое вы хотите использовать. И наоборот, вы можете использовать результат частичного просмотра и иметь метод, который просто возвращает вашу коллекцию, но это выходит за рамки этого конкретного вопроса. - person Nikki9696; 02.08.2018
comment
Кроме того, я не уверен, насколько вы новичок, но просто для ясности, этот способ стирает всю страницу и заменяет ее. Вы потеряете любые другие свойства, которые могли быть в вашей модели раньше. - person Nikki9696; 02.08.2018
comment
Спасибо, я попробую это и посмотрим, что произойдет - person Max; 02.08.2018