如何在控制器上将id从视图传递给Action

时间:2014-05-22 13:49:23

标签: c# html entity-framework asp.net-mvc-4

我正在尝试设计一种方法来添加和删除网络日志中的帖子。到目前为止,我在视图中有以下代码。

@foreach (Comment comment in comments.OrderBy(x => x.CommentCreateDate))
{

    <div>
        @Html.DisplayFor(modelItem => comment.CommentId)<br/>
        @Html.DisplayFor(modelItem => comment.CommentCreateDate)<br />
        @Html.DisplayFor(modelItem => comment.CommentUpdateDate)<br />
        @Html.DisplayFor(modelItem => comment.CommeterName)<br/>
        @Html.DisplayFor(modelItem => comment.EmailAddress)<br/>
        @Html.DisplayFor(modelItem => comment.CommentText)<br />
        @Html.CheckBoxFor(modelItem => comment.Approved)
</div>
    <hr />


}

@*@Html.ActionLink("Delete", "Delete", new { id = post.PostId }) |*@


<form method="get" action="ApproveComment">
    <input type="submit" id="btnApproveComment" class="btn-default" value="Approve" />
    <input type="submit" id="btnDelete" class="btn-default" value="Delete" />
</form>

然后在我的行动中我有以下内容:

//[HttpGet]
        public ActionResult ApproveComment(int id)
        {

            bool isChecked = false;
            Comment comment = new Comment();

            if (Request.Form["chkApprove"] != null)
            {
                isChecked = Convert.ToBoolean((Request.Form["chkApprove"]));
            }

            comment.CommentId = id;
            comment.Approved = isChecked;
            db.Comments.Add(comment);
            db.SaveChanges();

            return View("Admin");
        }

我的评论模型:

public class Comment
    {

        // Comments have id, poast, id, time, email, comment,
        [Key]
        public int CommentId { get; set; }
        public int PostId { get; set; }

        [ForeignKey("PostId")]
        public virtual Post Post{get; set;}
        public string CommentCreateDate { get; set; }
        public string CommentUpdateDate { get; set; }
        public string CommeterName { get; set; }
        public string EmailAddress { get; set; }
        public string CommentText { get; set; }
        public bool Approved { get; set; }
    }

我的帖子模型:

public class Post
{
    [Key]
    public int PostId { get; set; }
    public string Title { get; set; }
    public DateTime CreatedDate{get;set;}
    public DateTime UpdateDate { get; set; }
    public string Body { get; set; }
    public ICollection<Comment> Comments { get; set;}
    /// <summary>
    /// tag has posts and posts have tag -
    /// </summary>
    public ICollection<Tag> Tags { get; set; }

}

我真正想要的是能够使用复选框选择评论,然后删除或批准评论。为此我需要传递ID,虽然我看到我可以使用Action Link执行此操作但我不需要链接,只需传递ID和复选框的值。

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

你的距离不是一百万英里,如果你将当前的代码放在一个表单然后让它发布它应该发布复选框结果的值,因为CheckBoxFor是一个< em> editable 字段。

使用CheckBoxFor是关键(或任何其他编辑器扩展),因为UI是专门为回放到服务器而呈现的,因此它使用MVC模型绑定器用于映射表单的特殊属性来装饰标记到你的C#模型

@using (Html.BeginForm("Save", "Comments", FormMethod.Post))
{
    @foreach (Comment comment in comments.OrderBy(x => x.CommentCreateDate))
    {
        <div>
        @Html.DisplayFor(modelItem => comment.CommentId)<br/>
        @Html.DisplayFor(modelItem => comment.CommentCreateDate)<br />
        @Html.DisplayFor(modelItem => comment.CommentUpdateDate)<br />
        @Html.DisplayFor(modelItem => comment.CommeterName)<br/>
        @Html.DisplayFor(modelItem => comment.EmailAddress)<br/>
        @Html.DisplayFor(modelItem => comment.CommentText)<br />
        @Html.CheckBoxFor(modelItem => comment.Checked)
        </div>
    }  
    <br />
    <input type="submit" id="btnApproveComment" name="action" class="btn-default" value="Approve" />
    <input type="submit" id="btnDelete" name="action" class="btn-default" value="Delete" />
}

然后在服务器端,您只需确定用户调用的操作,即批准或删除。为此,您可以将表单中每个按钮的名称设置为相同的值,并根据发布的值确定操作,即

public ActionResult Save(MyModel model, string action)
{
    var commentsToAction = model.Comments.Where(x => x.Checked);
    if (action == "Approve") {
        foreach (var c in commentsToAction) {
            // approve c
        }
    } else if (action == "Delete") {
        foreach (var c in commentsToAction) {
            // delete c
        }
    }
}

注意 - 假设您使用的是视图模型,您还可以将Action属性添加到MyModel,然后您无需手动查看FormCollection,只需检查model.Action

答案 1 :(得分:0)

我刚刚发现我必须做这样的事情来传递id:

@{ Html.RenderAction("ApproveComment", new { id = comment.CommentId });}

答案 2 :(得分:-1)

@ Html.ActionLink会创建一个锚标记(&lt; a&gt;),这不是作业的正确元素。

您提出的解决方案无效,因为两个提交输入都会触发相同的表单操作。

<form method="get" action="ApproveComment">
    <input type="submit" id="btnApproveComment" class="btn-default" value="Approve" />
    <input type="submit" id="btnDelete" class="btn-default" value="Delete" />
</form>

A&lt; button type =“submit”&gt;批准&lt; button&gt;&gt;或&lt; input type =“submit”value =“Approve”/&gt;触发其最近的父级&lt; form&gt;上的操作。

在没有 AJAX的情况下执行此;你需要创建两个表单。

您应该使用HtmlHelper来创建表单,以便将正确的路由值传递给其操作,例如(其中“ApproveComment”/“DeleteComment”是动作,“Post”是用于PostController的名称)

@using (Html.BeginForm("ApproveComment", "Post", FormMethod.Post, new { id = post.PostId })) {
    <button type="submit">Approve</button>
}
@using (Html.BeginForm("DeleteComment", "Post", FormMethod.Post, new { id = post.PostId })) {
    <button type="submit">Delete</button>
}

希望有所帮助。