2017-12-10 3 views
0

したがって、2つのコントローラクラスがあります。ASP.NET Core MVC異なるコントローラメソッドにViewModelを送信する方法

AnnouncementsController、これは、ユーザーの投稿を含むソートのホームページを生成するだけです。その後

// GET: Announcements 
    public async Task<IActionResult> Index() 
    { 
     var announcements = await _context.Announcement.ToListAsync(); 
     announcements = announcements.OrderByDescending(x => x.CreatedOn).ToList(); 
     foreach (var ann in announcements) 
     { 
      ann.TimeAgo = ann.CreatedOn.TimeAgo(); 
     } 

     var users = await _context.Users.ToListAsync(); 
     var comments = await _context.Comment.ToListAsync(); 
     AnnouncementAndCommentsViewModel aacVM = new AnnouncementAndCommentsViewModel(); 

     AnnouncemenstViewModel announcemenstViewModel = new AnnouncemenstViewModel(); 
     announcemenstViewModel.Announcement = announcements; 
     announcemenstViewModel.User = users; 
     announcemenstViewModel.Comment = comments; 

     CommentViewModel commentViewModel = new CommentViewModel(); 

     aacVM.announcemenstViewModel = announcemenstViewModel; 
     aacVM.commentViewModel = commentViewModel; 

     ViewData.Add("currentUserID",GetCurrentUser().Id); 

     return View(aacVM); 
    } 

私はAnnouncementController IndexビューからCommentsController

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create(CommentViewModel commentViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var comment = new Comment(); 
      comment.CreatedOn = DateTime.Now; 
      comment.Body = commentViewModel.Comment.Body; 

      Announcement announcement = GetAnnouncement(commentViewModel.Announcement.AnnouncementID); 
      comment.Announcement = announcement; 
      ApplicationUser user = GetCurrentUser(); 
      comment.User = user; 

      _context.Add(comment); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction(nameof(Index)); 
     } 
     return View(commentViewModel); 
    } 

を持って、私は記事のリストを持っているし、私は行くとは対照的に、書き込み、そのビューに直接コメントを追加できるようにしたいです別のビューに

私は2つのViewModelsを持っています.1つはアナウンスを格納し、もう1つはコメント用です。

コメントコントローラーでCreate Postメソッドを呼び出そうとしていますが、CommentViewModelを受け入れる引数はありません。 私はに送信され得続けるここに私のindexビューです。で満たされたボディと

をする方法を取得し、どのように私は、@ShyjuがコメントしたようCommentsController

@model Treharris.Models.AnnouncementAndCommentsViewModel; 
. 
. 
. 
@foreach (var item in Model.announcemenstViewModel.Announcement) 
     { 
. 
. 
. 
<div class="announcement-body"> 
        <p>@Html.DisplayFor(modelItem => item.Body)</p> 
       </div> 
       <div class="comments"> 
        <p id="comment">Comments</p> 
        @using(Html.BeginForm("Create","Comments", FormMethod.Post, 
        new { cvm = Model.commentViewModel })) 
        { 
         @@Model.commentViewModel.Announcement = item; 
         @Html.HiddenFor(m => m.commentViewModel.Announcement) 
         @Html.TextBoxFor(m => m.commentViewModel.Comment.Body, 
         new { placeholder = "Comment body" }) 
         <input type="submit" value="Create" /> 

        } 
+0

動作するように結合モデルの場合は、フォームの要素名は、アクションメソッドのパラメータのプロパティ名/階層と一致する必要があります。できるだけ単純なフラットビューモデルを作成します。 – Shyju

答えて

0

にデータを投稿しようとして作成します。モデルのバインディングがフォーム拡張を使用して動作するようにするには、ビューに渡すモデルを、ポストアクションが受け取るモデルと同じにする必要があります。

あなたが生成されますHTMLを見ると、

@Html.HiddenFor(m => m.commentViewModel.Announcement)

<input type="hidden" name="commentViewModel.Announcement" value="propVal" />ようなものを出力します。アクション

あなたは commentViewModelという名前のプロパティはありませんが、 CommentViewModelオブジェクトがAnnouncementという名前のプロパティを持って期待しています。そのため、バインディングは発生しません。

どちらか

OR

ドロップし、ビューモデルと一致するように、ポストアクションメソッドにパラメータを変更するが、フォーム上に存在しないすべてのプロパティがnullとして掲載されていることに注意してください

<form asp-controller="Comments" asp-action="Create" method="post"> 
     <input type="hidden" name="Announcement" value="@Model.commentViewModel.Announcement" /> 
     <input type="text" name="Comment.Body" placeholder="Comment body" value="@Model.commentViewModel.Comment.Body" /> 
     <input type="submit" value="Create" /> 
</form> 

はに関するすべての情報を含めることを忘れないでください:.NETのコアで非推奨と次のようにバインディングのこれらのタイプのための単純なHTMLを使用しているHTMLフォームの拡張メソッドオブジェクトを隠しフィールドとして使用します。フォームに複雑なオブジェクトを投稿することはできません。これはHTMLの機能/制限です。

は例えば、シンプルなとしてフォームでのアナウンスIDを含める:

<input type="hidden" name="Announcement.Id" value="@item.id" /> 
関連する問題