无法使用Asp.net MVC 5控制器实施投票系统

时间:2018-08-09 18:37:37

标签: c# asp.net asp.net-mvc

我试图基本上让用户“喜欢”帖子,我称其为“投票”应用程序中的帖子。

我有一个投票类,它记录用户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。

2 个答案:

答案 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