MVC4表单未将对象传递给操作

时间:2013-11-18 17:08:30

标签: asp.net-mvc asp.net-mvc-4

我正在努力学习mvc和我正在制作一个简单的社交网络来学习。

此视图显示一个简单的墙,您可以在其中添加帖子,为帖子添加评论以及删除帖子。

我在尝试删除这里的帖子时遇到了问题,并且无法在我的生活中找到它。我需要做的就是为每个帖子显示一个删除按钮(这样可以正常),然后当他们按下删除时,将extendedPostID发送到控制器操作“删除帖子”。

它正在调用该操作,但没有数据传回控制器。我越努力解决这个问题就越困惑。

有人可以看看并给我一些建议。

提前致谢。

查看

    @model IEnumerable<Q001.Models.PostExtended>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@Html.Partial("_addNewPost", new Q001.Models.Post())

THIS IS THE END OF THE PARTIAL


<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.post.UserID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.post.WallID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.post.PostDateTime)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.post.PostContent)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {        

        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.post.UserID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.post.WallID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.post.PostDateTime)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.post.PostContent)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Username)
            </td>

            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Surname)
                </td>          

            <td>
                @foreach (var comment in item.CommentExtended)
                {
                    @Html.DisplayFor(modelItem => comment.Comment.CommentContent)
                    @Html.DisplayFor(modelItem => comment.Comment.CommentDateTime)
                    @Html.DisplayFor(modelItem => comment.FirstName)
                    @Html.DisplayFor(modelItem => comment.Surname)
                    @Html.DisplayFor(modelItem => comment.Username)
                }

                @Html.Partial("_addNewComment", new Quitzz001.Models.Comment() { PostID = item.post.PostID })
            </td>


            }
            <td>        
                @using (Html.BeginForm("DeletePost", "PostExtended"))
                {
                    @Html.AntiForgeryToken()
                    @Html.HiddenFor(PostExtendedID => item.PostExtendedID)
                    <input type="submit" value="Delete" />
                }

                @Html.ActionLink("Delete Post", "DeletePost", new { id = item.post.PostID })
                @Html.ActionLink("Edit", "Edit", new { id = item.post.PostID }) |
                @Html.ActionLink("Details", "Details", new { id = item.post.PostID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.post.PostID })
            </td>
        </tr>

    }

</table>

动作

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult DeletePost(Int32 item_PostExtendedID)
    {
     //delete post
    }

编辑:

我已根据以下答案更新了上面的代码。我检查了html源代码,隐藏字段似乎已填充。

我得到的错误是

The parameters dictionary contains a null entry for parameter 'PostExtendedID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult DeletePost(Int32)' in 'Q001.Controllers.PostExtendedController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter

这是其中一个html表单的隐藏字段

<input data-val="true" data-val-number="The field PostExtendedID must be a number." data-val-required="The PostExtendedID field is required." id="item_PostExtendedID" name="item.PostExtendedID" type="hidden" value="3">

但是我注意到id是item_PostExtendedID而不是PostExtendedID。 (我尝试将控制器中的变量名更改为item_PostExtendedID,但仍然没有运气)。

这可能是问题吗?

3 个答案:

答案 0 :(得分:1)

您传递给action方法的所有内容都是PostExtendedId。更新您的操作方法签名:

public ActionResult DeletePost(int PostExtendedID)

答案 1 :(得分:1)

您提交的表单正在传递ID

@Html.HiddenFor(modelItem => item.PostExtendedID)

并且您要发布的操作采用PostExtended类型的对象

public ActionResult DeletePost(PostExtended PostExtended)

除非您为PostExtended创建了自定义模型绑定器,否则MVC无法自动为您绑定此绑定。您需要更改操作以获取与表单中的元素同名的int(PostExtendedID)

(我假设ID是一个i​​nt,如果它是一个字符串,显然会把它变成一个字符串)

public ActionResult DeletePost(int PostExtendedID)
{
//now you can use the id to do what you need to do    

}

答案 2 :(得分:1)

写作时

@Html.ActionLink("Delete Post", "DeletePost", new { id = item.post.PostID })

它会在您的操作中查找名为id的参数。如果您的PostExtended模型没有id属性,请在视图中将其重命名为与您的模型匹配,或者只是按照以下方式编写您的操作:

public ActionResult DeletePost(int id)
{
   // Delete The Post
}