2016-03-20 8 views
-1

Ich habe diese Rasierer-Ansicht, die ein paar Elemente auf einer Bedingung enthalten, muss ich einen Kommentar zu einem der Artikel hinzufügen (wie Kommentar hier in SO). versucht, die ID an eine andere Form übergeben, hat nicht funktioniert, das ist, was ich getan habe, aber ich denke, es ist der falsche Ansatz. so weit ich habe diese: Anzeige die Überprüfung nach Benutzer (Parameter)Artikel hinzufügen Base auf anderen Artikel-ID in einer zu vielen Relation

 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()); 
    } 

in der Ansicht

@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++) 
    { 
    } 

} 

Ich habe versucht, id zu der Ansicht zu übergeben und die die das bekommen Post Controller sehen so aus:

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); 
    } 

aber, kein Glück, was es die besten Praktiken, es zu tun?

Antwort

1

Das Problem ist, dass AddComent-Methode wartet Comments-Modell und Ihre View Beiträge ReviewViewModel. So gibt es zwei Möglichkeiten zur Abhilfe:

1) Wenn Sie nur die folgende Methode verwenden id Wert übergeben und dann mit dem gleichen Parameternamen in der AddComent Methode wie unten dargestellt:

Ausblick:

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

Controller:

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


2) Sie können das Ansichtsmodell an den Controller übergeben und dann versuchen, Mapping Ansichtsmodell zu DomainModel wie unten dargestellt:

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); 
} 

Für weitere Informationen besuchen http://automapper.org/. Hoffe, das hilft ...