我认为最好的方法是使用 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)
}
并且您的 Partial 视图将被强类型化为一个集合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});
}
}