我正在努力学习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,但仍然没有运气)。
这可能是问题吗?
答案 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是一个int,如果它是一个字符串,显然会把它变成一个字符串)
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
}