我试图基本上让用户“喜欢”帖子,我称其为“投票”应用程序中的帖子。
我有一个投票类,它记录用户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()并在需要呈现帖子详细信息页面时在视图中打印“票数”。 / p>
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仍为null。
答案 0 :(得分:0)
因为您当前的视图代码将为具有 name 属性值Story.Id
的隐藏输入元素生成HTML标记。
<input name="Story.Id" type="hidden" value="1">
提交表单后,模型绑定程序将无法将该输入的值映射到StoryId
对象的Vote
属性。为了使模型联编程序正确地映射值,输入元素名称应与用作操作方法的参数的类的属性名称匹配。
您可以创建一个隐藏输入,其名称属性值与您的属性名称匹配
@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)
答案 1 :(得分:0)
您使用的是HiddenFor
而不是Story.Id
的{{1}}。
如果您的StoryId
包含Model
的值,则只需使用
StoryId