使用ViewModel

时间:2019-04-05 02:33:58

标签: c# asp.net asp.net-mvc model-view-controller

我正在使用ASP.NET MVC5中的民意调查应用程序。我有三个SQL表用于它们的相关类(投票,投票选项,投票)。每个投票都有一个ID,每个PollOption都有一个ID,还有一个与PollID相匹配的外键,每个表决都有一个ID,以及一个与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(这意味着它将计算该投票中的所有投票,而不是该投票中属于该polloption的所有投票)

如何将我的Votes.Count行限制为仅包括属于该特定PollOption的那些,而不是属于该Poll的所有投票。

如何将我的Votes.Count行限制为仅包括属于该特定PollOption的选票,而不是属于该Poll的每一票。

希望这是有道理的。

非常感谢您的帮助。

编辑:

以下是模型:

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 :(得分:0)

您需要一个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);
}