我知道有很多关于@Html.Partial
,@Html.RenderPartial
,甚至使用与@Html.Action
和[ChildActionOnly]
一起使用PartialView();
的问题,但我的问题因为它涉及FormMethod.Post
而稍微复杂一点,所以对于这个新手来说,任何帮助都会非常受欢迎。首先让我在解释问题之前向您展示两个ViewModel:
public class Article
{
public int ArticleId {get; set;}
public int UserId {get; set;}
public virtual ICollection<Comment> Comments {get; set;}
//...
}
public class Comment
{
public Comment(int AId, int UId)
{
UserId = UId;
ArticleId = AId;
Content = "";
//...
}
public int CommentId {get; set;}
public int ArticleId {get; set;}
public int UserId {get; set;}
//...
}
所以我的@model BlogSite.Models.Article
视图有一个局部视图,它根据ArticleId查询所有注释,并将它们注入到View~ / Article / Details / 5中(想要根据标题重新路由URL,但这是为了另一天)使用@Html.Action("GetCommentsById", "Article", new { id = Model.ArticleId })
就好了,但我使用种子方法将注释添加到数据库,所以我的问题是在使用表单时。我需要在PartialView @model BlogSite.Models.Comment
中提交FormMethod.Post之前传递ArticleId。
以下是我尝试做的事情,因为Comment对象为null。
这是注入 以下是Detail.cshtml的部分以及我尝试过的选项: 以下是GET / POST控制器操作: 问题是当我调试应用程序时,HttpGet中的注释没有保存两个整数的值。我认为Comment对象将在堆上,但它表示它为null。有人能指出我正确的方向吗?我知道Ajax和JSON最终将成为我使用的解决方案,但我仍然需要先使用这些操作。提前致谢!请随意尽可能地批评: - ) *注意我想知道我是否甚至需要PartialView为 以下是我在主视图中对Action的调用(Details.cshtml): 这是Controller Action AddComment,它返回PartialView: 注意:必须实例化ModelView对象并将其传递给部分视图 这是_AddPostPartial PartialView,它承载将实例化对象发布到服务器的Form。然后我将把我的InsertComment(评论评论)调用到我的UoW中,其中包含我在ActionResult Post中看到的所有存储库: 这是ActionResult帖子: 通过使用UnitOfWork,我确保我将重新注入更新的注释
对于文章(例如ArticleId = 5)此函数位于在UnitOfWork中实例化的存储库中: 注意:我认为将评论添加到用户和文章的虚拟列表非常重要。当我拿出后两个Adds时,Details.cshtml
的@model BlogSite.Models.Comment
@using (Html.BeginForm("Post", "Article", FormMethod.Post))
{
@Html.ValidationSummary(true)
<div id="post-area">
@Html.TextBoxFor(m => m.Content, new { @class = "textarea" })
</div>
<div id="post-info">
<input type="submit" value="Post" title="Post" class="post-button" />
</div>
}
@Html.Action("AddComment", new { AId = Model.ArticleId, UId = WebSecurity.CurrentUserId })
[HttpGet, ChildActionOnly]
ActionResult AddComment(int AId, int UId)
{
Comment comment = new Comment(AId, UId);
return PartialView("_AddPostPartial", comment);
}
[HttpPost,ActionName("Post")]
public ActionResult AddComment(Comment comment)
{
if (ModelState.IsValid)
{
unitOfWork.ArticleRepository.InsertComment(comment);
RedirectToAction("Details", "Article", new { id = comment.ArticleId });
}
return PartialView("_AddPostPartial", comment);
}
@Model.Comment
?我基本上可以从View中传递我需要的参数来创建Comment对象,但是不是必须有一种方法来使用表单在ViewModel中创建不是主视图中ViewModel实例的新对象吗?我也明白我实际上是在使用[ActionName(“Post”)]在动作中调用相同的动作所以我不喜欢我这样做,所以我确信这是错误的。
return
!好的,我将分享我如何解决这个问题,所以如果其他人有问题,他们不会像我一样花费数小时。 @Html.Action("AddComment", "Article", new { AId = Model.ArticleId })
[HttpGet]
public ActionResult AddComment(int AId)
{
Comment comment = new Comment(AId, WebSecurity.CurrentUserId);
return PartialView("_AddPostPartial", comment);
}
@model BlogSite.Models.Comment
@using (Html.BeginForm("Post", "Article", FormMethod.Post)){
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.ArticleId)
<div id="post-area">
@Html.TextAreaFor(m => m.Content, new { @id = "comment", @class = "textarea", @name = "comment" })
</div>
<div id="post-info">
<input type="submit" value="Post" class="post-button" />
</div>
}
<script>
$("form").submit(function (event) {
$("textarea[name=comment]").val("");
});
</script>
[HttpPost]
public ActionResult Post(Comment comment)
{
if (ModelState.IsValid)
{
unitOfWork.ArticleRepository.InsertComment(comment);
return RedirectToAction("Details", "Article", new { id = comment.ArticleId });
}
return PartialView("_AddPostPartial", comment);
}
public void InsertComment(Comment comment)
{
// actual insert of comment into database
context.Comments.Add(comment);
Article article = context.Articles.Find(comment.ArticleId);
UserProfile commenter = context.Users.Find(comment.UserId);
// in-memory List for both User and Article
article.Comments.Add(comment);
commenter.Comments.Add(comment);
context.Entry(article).State = EntityState.Modified;
context.Entry(commenter).State = EntityState.Modified;
Save();
}
return RedirectToAction("Details", "Article", new {comment.ArticleId});
使我认为他们在内存中创建ER时,新注释没有呈现?我的实际文章和用户域模型都有ICollection<Comment> Comments {get; set; }
所以也许这就是我需要这样做的原因。我认为在这种情况下使用界面会好得多,但如果我错了,请纠正我?