【问题标题】:ASP.NET MVC 3 Adding comments in article viewASP.NET MVC 3 在文章视图中添加评论
【发布时间】:2011-03-28 09:11:01
【问题描述】:

我有 public ICollection<Comment> Comments { get; set; } 的文章模型和评论模型。我已经为文章创建了视图(详细信息视图),我想显示从模型文章(没问题)和 cmets 到文章到 cmets 以及之后的所有内容,然后显示用于向文章添加评论的表单(不在其他页面中,我希望它在查看文章)。现在我有这个:

@model SkMoravanSvitavka.Models.Article

@{
    ViewBag.Title = "Zobrazit";
}

<h2>Zobrazit</h2>

<fieldset>
    <legend>Article</legend>

    <div class="display-label">Title</div>
    <div class="display-field">@Model.Title</div>

    <div class="display-label">Text</div>
    <div class="display-field">@Model.Text</div>

    <div class="display-label">PublishedDate</div>
    <div class="display-field">@String.Format("{0:g}", Model.PublishedDate)</div>
</fieldset>

@if (Model.Comments != null)
{
    foreach (var comment in Model.Comments)
    {
        @Html.Partial("_Comment", comment)
    }
}



<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ArticleID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

它显示文章,并且所有 cmets 对文章都有部分视图。现在我不确定如何添加用于添加 cmets 的表单。谢谢

编辑:这是我的评论控制器和创建方法(vytvorit = create in czech :)):

 public ActionResult Vytvorit(int articleID)
        {
            var newComment = new Comment();
            newComment.articleID = articleID; // this will be sent from the ArticleDetails View, hold on :).
           newComment.Date = DateTime.Now;
            return View(newComment);  
        } 

        [HttpPost]
        public ActionResult Vytvorit(Comment commentEntity)
        {
                db.Comments.Add(commentEntity);
                db.SaveChanges();
                return RedirectToAction("Zobrazit", "Clanek", new { id = commentEntity.articleID });
        }

当我将 @Html.RenderAction 更改为 @Html.Action 时,它可以工作。它正在显示用于评论的文本框,我可以添加评论,但存在的问题是它不仅添加了文本框,而且再次添加了我的网站(不仅仅是部分视图,而是所有视图),我确信我添加了为评论创建视图作为部分。

【问题讨论】:

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


    【解决方案1】:

    创建一个新的 Partial 视图,使其成为 Comment 类型的强类型视图。

    从脚手架模板中,选择“创建”模板。

    处理评论的正常添加新场景。

    将此部分视图添加到文章详细信息页面。

    请注意,当您要保存新评论时,您需要获取托管文章 ID。

    希望现在很清楚,如果没有,请告诉我。

    更新:假设您将“添加评论”部分视图添加到“文章详细信息”视图中,您可以执行以下操作以添加评论。

    1- 修改CommentController 中的GET(创建)操作,如下所示:

    public ActionResult Create(int articleID)
        {
                var newComment = new CommentEntity();
                newComment.articleID = articleID; // this will be sent from the ArticleDetails View, hold on :).
    
                return View(newComment);            
        }
    

    1- 像这样进行POST(创建)操作:

    [HttpPost]
    public ActionResult Create(Comment commentEntity)
    {
        // Complete the rest..
    }
    

    2- 评论的部分视图将如下所示:

    @model NGO.Models.Comment
    
    @using (Html.BeginForm())
            {            
                @Html.ValidationSummary(true)
                <div class="addcommentbox">
                    <h2> Add Comment </h2>
                    @Html.TextAreaFor(model => model.Description)
                    <div class="ErrorMessage">
                    @Html.ValidationMessageFor(model => model.Description)
                    </div>                    
                    <input id="addComment" type="button" onclick="" value="Add" />
                </div>
    
            }
    

    3- 在 ArticleDetails 页面中,在您需要显示添加评论部分的所需位置,使用 RenderAction 方法呈现 AddComment Partial 视图,如下所示:

    Html.RenderAction("Create", "Comment",new {articleID = Model.ID});
    

    上一行将在CommentColtroller 中调用GET(Create) 操作并传递当前的文章ID,因此AddComment Partial 视图将已经填充了当前的文章ID(这就是我们想要的)。

    就是这样,如果还不清楚,请随时问我,如果它对你有用,请告诉我

    【讨论】:

    • 我为评论创建了部分视图,添加到文章中就可以了。但我不确定如何处理 ArticleID。我的评论看起来像这样public virtual int CommentID { get; set; } public virtual string Text { get; set; } public virtual DateTime Date { get; set; } 我希望没问题。我将 POST 从详细信息添加到控制器:[HttpPost] public ActionResult Zobrazit(Comment newComment) { db.Comments.Add(newComment); return RedirectToAction("Index"); }
    • 您可以为articleId创建一个隐藏的输入字段
    • 正确,两者会导致相同的结果
    • 很棒的更新,谢谢,但我的 RenderAction 有问题,它显示错误:编译器错误消息:CS1502。
    • 很可能与您的操作结果有关,您可以发布评论控制器创建代码吗? (获取和发布)
    【解决方案2】:

    我强烈建议您为文章页面创建视图模型。像下面这样;

    public class ArticleViewModel { 
    
         public Article _article {get;set;}
         //this is for the comment submit section
         public Comment _comment {get;set;}
         //this for the comments that you will view
         public IQueryable<Comment> _comment {get;set;}         
    
    }
    

    之后,将它从您的控制器传递给您的视图,并使您的视图强类型化到此 ArticleViewModel 类。

    创建一个包含在表单标签内的部分,如下所示;

    @using(Html.BeginForm()){
    
         @*Put your code inside here.
           Create inputs for sending comments. like below;*@
         @Html.TextboxFor(Model._comment.Content)
    
    }
    

    然后为此创建一个方法;

    [HttpPost]
    [ActionName("name_of_your_article_page_action")]
    public ActionResult Create(Comment commentEntity) {
    
    }
    

    注意:当然,您不需要创建单独的视图模型。您可以对输入的名称进行硬编码,但这使得使用验证和其他类型的东西变得困难。但并非不可能使用验证!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多