未能使用 MVC 5 控制器实现投票系统 Asp.net



我试图让用户"喜欢"一个帖子,我称之为"投票"在我的应用程序中的帖子。

我有一个投票类,它记录了用户ID,postid(称为故事(,其余的都是样板。

public class Vote
{
public int Id { get; set; }
public string VoterId { get; set; }
public virtual ApplicationUser Voter { get; set; }
public int StoryId { get; set; }
public Story Story { get; set; }
public DateTime CreatedAt { get; set; }
}

在故事模型中,我引用了一个投票集合,理论上我称之为 .Count(( 并在渲染帖子详细信息页面时将"票数"打印到视图中。

public virtual ICollection<Vote> Votes { get; set; }

在剃刀视图中,当用户查看帖子(故事(时,决定是否投票支持它,我有这个表格。因此,如果登录的用户不是故事的作者,那么他们可以投票支持故事。

@if (!Model.IsStoryOwner)
{
<div class="row mt-1">
<div class="col-3">
@using (Html.BeginForm("New", "Vote"))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(x => x.Story.Id, new { StoryId = Model.Story.Id })
<div class="btn-group">
<button type="submit" class="btn btn-info voteBtn" id="LikeBtn">
<i class="fa fa-heart mr-2"></i>
Vote
</button>
</div>
}
</div>
</div>
}

这将命中以下控制器:

//POST /vote/new
//FOR adding a vote to a story
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult New(Vote vote)
{
var voterId = User.Identity.GetUserId();
var newVote = new Vote
{
VoterId = voterId,
StoryId = vote.StoryId,
CreatedAt = DateTime.Now
};
dbContext.Votes.Add(newVote);
dbContext.SaveChanges();
return View();
}

但是,即使我已经验证在运行应用程序时它不在客户端,storyId 仍显示为空。

因为您当前的视图代码将为名称属性值为Story.Id的隐藏输入元素生成 HTML 标记。

<input name="Story.Id" type="hidden" value="1">

提交表单后,模型绑定器将无法将该输入的值映射到Vote对象的StoryId属性。为了使模型绑定程序正确映射值,输入元素名称应与用作操作方法参数的类的属性名称匹配。

您可以使用与您的媒体资源名称匹配的名称属性值创建隐藏输入

@using (Html.BeginForm("New", "Vote"))
{
@Html.AntiForgeryToken()
<input type="hidden" name="StoryId" value="@Model.Story.Id" />
<div class="btn-group">
<button type="submit" class="btn btn-info voteBtn" id="LikeBtn">
<i class="fa fa-heart mr-2"></i>Vote
</button>
</div>
}

或者,您可以使用生成与上述相同的标记的Html.Hidden帮助程序方法。

@Html.Hidden("StoryId",Model.Story.Id)

您使用的是HiddenForStory.Id,而不是StoryId

如果您的Model包含StoryId的值,您可以简单地使用

@Html.HiddenFor(x => x.StoryId)

最新更新