在一对多关系中添加基于其他项ID的项目

时间:2016-03-20 17:20:52

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-viewmodel

我有这个剃刀视图,其中包含一些基于某些条件的项目,我需要为任何项目添加注释(就像在SO中注释一样)。 试图将id传递给另一种形式并不起作用, 这就是我所做的,但我认为这是错误的做法。 到目前为止我有这个: 根据用户(参数)显示评论

     public async Task<ActionResult> ReviewAbout(int? id)
    {
        var profilec = await db.profile.FindAsync(id);

        IEnumerable<ReviewViewModel> viewModel = from review in db.reviews.OrderBy(d => d.Created)
                                                 .Include(s => s.subject).Where(m => m.subject.MemberID == profilec.MemberID)
                                                 .Include(r => r.Writer)
                                                 join comment in db.Comments
                                                 on review.ReviewId equals comment.ReviewId into joinedReviewComment
                                                 select new ReviewViewModel
                                                 {
                                                     //parameters
                                                     ReviewId = review.ReviewId,

                                                     Comments = joinedReviewComment.Select(c => new CommentViewModel
                                                     {
                                                         CommentBody = c.CommentBody,
                                                         CommentGBU = c.CommentGBU,
                                                         anonymous = c.anonymous,

                                                         CommentsWriterName = c.CommentsWriterName
                                                     }).ToList(),
                                                 };

        return View(viewModel.ToList());
    }
视图中的

    @model IList<MyWebSite.ViewModels.ReviewViewModel>
@for (int i = 0; i < Model.Count(); i++)
{
    @Html.DisplayFor(x => x[i].ReviewId)

    @Html.HiddenFor((x => x[i].ReviewId))

    @Html.ActionLink("comment", "AddComent", new { id = @Html.DisplayFor(x => x[i].ReviewId) })


    @for (var j = 0; j < Model[i].Comments.Count; j++)
    {
    }

}

我试图将id传递给视图并获取 邮政控制器看起来像这样:

  public async Task <ActionResult > AddComent(Comments commnets )
    {


        //commnets.ReviewId = commnets.ReviewId;
        //commnets.ReviewId = commnets.review.ReviewId;
        //commnets.ReviewId = commnets.ReviewId;

        if (ModelState.IsValid)
        {
            db.Comments.Add(commnets);
            await db.SaveChangesAsync();
            return RedirectToAction("index");
        }
        return View(commnets);
    }

但是,没有运气,这是最好的做法吗?

1 个答案:

答案 0 :(得分:1)

问题是AddComent方法等待Comment模型和View发布ReviewViewModel。因此,解决方法有两种选择:

1)如果您只是传递id值,请使用以下方法,然后在AddComent方法中使用相同的参数名称,如下所示:

<强> 查看:

@Html.ActionLink("Comment", "AddComent", new { comment = item.ID }) 

<强> 控制器:

public async Task <ActionResult> AddComent(Comment comment)
{
    ...
}


2)您可以将ViewModel传递给Controller,然后尝试将ViewModel映射到DomainModel,如下所示:

public async Task <ActionResult > AddComent(IEnumarable<ReviewViewModel> reviews)
{
    if (ModelState.IsValid)
    {

        //Mapping ViewModel to DomainModel (Review > ReviewViewModel)
        var viewModel = new ReviewViewModel();
        AutoMapper.Mapper.CreateMap<Review , ReviewViewModel>();
        AutoMapper.Mapper.Map(model, viewModel);
        //
        db.Comments.Add(model);
        await db.SaveChangesAsync();
        return RedirectToAction("index");
    }
    return View(model);
}

有关详细信息,请访问http://automapper.org/。希望这会有所帮助...