私はここ数週間で MVC3 を学んでおり、十分に単純な機能であると思われるものを書き込もうとしていますが、正しく動作させるのに実際の問題があります。
シナリオ
私のウェブサイトには、ホームページに要約されたニュース投稿が含まれ、各記事の詳細を個別のページに表示するためのリンクが含まれます。
各記事にはコメントを付けることができ、これらのコメントは各記事の詳細ページの最後に表示されます。認証されたユーザーは、記事自体を表示するページから記事に自分のコメントを投稿できる必要があります。ユーザーが別のページに移動するのを避けたいです (コードの観点からは、この方が簡単であることは理解していますが、それが優れた UX であることに同意しません!)。
私がこれをどのように見せたいかの例として、Scott Hanselman のブログ ( http://www.hanselman.com ) は完璧な例です (ただし、彼のホームページには要約ではなく記事全体が表示されます!)。コメント ページに移動し、「コメントを追加」フォームが記事の下部にきちんと配置されています。
今いる場所
ニュース セクションの Controller を書き、Index メソッド (最新の X 件の投稿を取得する) と、記事全体とコメントを表示する "Comments" メソッドを使用しました。独自の Controller メソッドを使用して、「CommentForm」という部分ビューも作成しました。以下のコントローラーのコード スニペット:
//
// GET: /News/
public ActionResult Index()
{
using (var nm = new NewsManager())
{
var news = nm.GetLatestActiveNewsArticles(50, "System");
return View(news);
}
}
//
// GET: /News/Comments/20
public ActionResult Comments(int id)
{
using (var nm = new Rapallo.Core.Managers.NewsManager())
{
var article = nm.GetArticle(id);
return View(article);
}
}
// GET: /News/CommentForm/20
[HttpGet()]
public ActionResult CommentForm(int newsId)
{
return View(new Rapallo.DataAccess.Comment() { NewsId = newsId });
}
//
// POST: /News/Comments/20
[Authorize()]
[HttpPost()]
public ActionResult Comments(Comment comment)
{
using (var nm = new NewsManager())
{
var article = nm.GetArticle(comment.NewsId.Value);
if (null == article) HttpNotFound();
}
using (var cm = new CommentManager())
{
if (cm.AddCommentToNews(comment.NewsId.Value, CurrentUser.RapalloUser.Id, comment.Body))
return RedirectToAction("Comments", "News", new { id = comment.NewsId.Value });
}
return HttpNotFound();
}
[コメント] ビューから、コメント フォームを追加する場所を示すコード スニペット:
@if (User.Identity.IsAuthenticated)
{
@Html.Partial("Comment", new Rapallo.DataAccess.Comment() { NewsId = Model.Id });
}
このビューは次を指定します。
@model Rapallo.DataAccess.News
そして最後に、コメントフォーム自体:
@model Rapallo.DataAccess.Comment
@using (Html.BeginForm())
{
@Html.TextAreaFor(m => m.Body);
<input type="submit" value="Send Comment" />
}
問題
簡単に言うと、コメント フォームを送信すると (正しく表示されます)、Comment モデルの NewsId が入力されないため、コントローラーは新しいコメントを正しいニュース投稿に関連付けることができません。
誰かが私が間違っているところを指摘していただければ幸いです!これを機能させるために NerdDinner のコードをいくつか適応させようとしましたが、電車の中で数え切れないほどの時間を費やして、部分ビューのさまざまな組み合わせ、さまざまなモデル、さらにはコントローラーのメソッドの名前を変更して、これを機能させようとしました。
「コメントの追加」機能を独自の別のフォームにカプセル化し、これを使用して単なるニュース記事以外にもコメントを追加できるようにすることに非常に熱心です。データベース スキーマとドメイン モデルは既にこれをサポートしていますが、UI を動作させることができません。
どんな助けでも大歓迎です。