Передача связанного третьего класса из третьей таблицы SQL в представление с помощью ViewModel - PullRequest
1 голос
/ 05 апреля 2019

Я работаю над приложением для опроса в ASP.NET MVC5. У меня есть три таблицы SQL для связанных классов (опрос, опрос, голосование). У каждого опроса есть идентификатор, у каждого опроса есть идентификатор, а также внешний ключ для сопоставления с PollID, и каждый голос имеет идентификатор и внешний ключ, чтобы соответствовать и PollOptionID, и PollID.

Я создал ViewModel и успешно извлекаю подробный вид опроса, чтобы включить список опций, доступных в этом опросе. Каков следующий шаг в вытягивании третьей таблицы в это представление? Я успешно могу подсчитать, сколько голосов существует в этом опросе в представлении, но я изо всех сил пытаюсь связать его с правильным вариантом опроса.

Я настроил модель представления и передал информацию. Я также использую два оператора .Include в своем контроллере для захвата как опросов, так и голосов.

Вот мое действие контроллера:

       public ActionResult DetailsTest(int id)
        {
            var poll = _context.Polls.Include(c => c.PollOptions).Include(c1 => c1.Votes).SingleOrDefault(c => c.Id == id);

            var viewModel = new PollDetailViewModel
            {
                Poll = poll,
            };

            return View(viewModel);
        }

и вот мой взгляд:

@model CamPoll.ViewModels.PollDetailViewModel

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Details Test</h2>

<p>
    @Html.ActionLink("New Poll Option", "New", "PollOptions", null, new { @class = "btn btn-primary" })
</p>


<table class="table table-bordered table-hover">
    <thead>
        <tr>
            <th>Poll Option</th>
            <th>Vote </th>
            <th>Vote Count</th>

        </tr>
    </thead>

    @foreach (var pollOption in Model.Poll.PollOptions)
    {
        <tr>
            <td>@Html.ActionLink(pollOption.Name, "Details", "PollOptions", new { id = pollOption.Id }, null)</td>

            <td>
                <button type="submit" class="btn btn-primary">Vote</button>
            </td>

            <td>@Model.Poll.Votes.Count()</td>

        </tr>
    }

    </table>

В моем примере в настоящее время есть 3 варианта опроса, и они вытягивают в таблицу и 2 голоса, оба из которых принадлежат одному и тому же варианту опроса. Так что в моей таблице строка @ Model.Poll.Votes.Count () должна тянуть 2,0,0 для каждой строки таблицы. Однако каждая строка вытягивает 2 (что означает подсчет всех голосов в этом опросе, а не всех голосов в этом опросе, которые принадлежат этому опросу)

Как мне ограничить мою строку Votes.Count, чтобы она включала в себя только те, которые принадлежат этому конкретному опросу, а не каждый голос, принадлежащий этому опросу.

Как я могу ограничить мою строку Votes.Count, чтобы она включала только те, которые принадлежат этому конкретному опросу, а не каждый голос, принадлежащий этому опросу.

Надеюсь, это имеет смысл.

Большое спасибо за помощь.

Edit:

Вот модели:

namespace CamPoll.Models
{
    public class Poll
    {
        [Key]
        public int Id { get; set; }

        public string Name { get; set; }

        public List<PollOption> PollOptions { get; set; }

        public List<Vote> Votes { get; set; }

    }

  public class PollOption
    {
        [Key]
        public int Id { get; set; }

        public int PollId { get; set; }

        [ForeignKey("PollId")]
        public Poll Poll { get; set; }

        public string Name { get; set; } 

        public int VoteCount { get; set; }

        public List<Vote> Votes { get; set; }

    }

    public class Vote
    {
        [Key]
        public int Id { get; set; }

        public DateTime VoteTime { get; set; }

        public int VoteWorth { get; set; }

        public int PollOptionId { get; set; }

        [ForeignKey("PollOptionId")]
        public PollOption PollOption { get; set; }

        public int PollId { get; set; }

        [ForeignKey("PollId")]
        public Poll Poll { get; set; }

    }
}

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

1 Ответ

0 голосов
/ 05 апреля 2019

вам нужно PollOptionsViewModel

public class PollOptionsViewModel
{
    public int PollOptionsId { get; set; }
    public int VoteCount { get; set; }
    //other properties
}

в вашем PollDetailViewModel добавьте список PollOptionsViewModel, затем в вашем контроллере внесите следующие изменения: -

public ActionResult DetailsTest(int id)
{
    var poll = _context.Polls.Include(c => c.PollOptions).Include(c1 => c1.Votes).SingleOrDefault(c => c.Id == id);

    List<PollOptionsViewModel> pollOptionsList = new List<PollOptionsViewModel>();

    var viewModel = new PollDetailViewModel
    {
        Poll = poll,
    };
    foreach(var pollOption in poll.PollOptions)
    {
        PollOptionsViewModel pollOptionsViewModel = new PollDetailViewModel
        {
            PollOptionsId = pollOption.PollOptionsId,
            VoteCount = pollOption.Votes.Count
        };
        pollOptionsList.Add(pollOptionsViewModel);
    }
    viewModel.PollOptionsViewModelList = pollOptionsList;

    return View(viewModel);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...