我正在使用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; }
}
}
“投票详细信息”视图上的预期结果是一个表,该表提取属于该表的每个轮询选项,以及属于每个轮询选项的每个投票的计数。
答案 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);
}