ViewModels を使用してデータを転送するのが最善の方法だと思います。質問があり、ユーザーが回答を投稿できる、投稿の後に質問とともに表示される、stackoverflow のようなアプリが必要だとします。
public class PostViewModel
{
public int ID { set;get;}
public string Text { set;get;}
public List<PostViewModel> Answers { set;get;}
public string NewAnswer { set;get;}
}
あなたのGET
行動で、あなたは質問を示します。URL から ID を取得し、サービス/リポジトリから質問の詳細を取得します。
public ActionResult Show(int id)
{
var post=new PostViewModel();
post=yourService.GetQuestionFromID(id);
post.Answers=yourService.GetAnswersFromQuestionID(id);
return View(post);
}
yourService.GetQuestionFromID
メソッドが、プロパティ値が入力された PostViewModel のオブジェクトを返すと仮定します。データは、データベースから、または WCF サービス呼び出しを介して取得できます。それはあなた次第です。またyourService.GetAnswersFromQuestionID
、メソッドは、その質問に対する回答を表す PostViewModel のリストを返します。これらの両方を という単一のメソッドに入れることができGetQuestionWithAnswers
ます。より明確にするために2つの方法を書きました。
今あなたのショービューで
@model PostViewModel
@Html.LabelFor(x=>x.Text);
@using(Html.Beginform())
{
@Html.HiddenFor(x=>x.ID);
@Html.TextBoxFor(x=>x.NewAnswer)
<input type="submit" />
}
<h3>Answers</h3>
@if(Model.Answers!=null)
{
@Html.Partial("Responses",Model.Answers)
}
そして、あなたの部分的なビューは、コレクションに強く型付けされますPostViewModel
@model List<PostViewModel>
@foreach(var item in Model)
{
<div> @item.Text </div>
}
ポストバックの処理は簡単です (HttpPost)
[HttpPost]
public ActionResult Show(PostViewModel model)
{
if(ModelState.IsValid)
{
//get your data from model.NewAnswer property and save to your data base
//or call WCF method to save it.
//After saving, Let's redirect to the GET action (PRG pattern)
return RedirectToAction("Show",new { @id=model.ID});
}
}