当我开始使用 MVC 时,我也对强类型视图概念感到困惑!
然后,在额头上打了几拳之后,我意识到创建绑定到模型的视图的想法并不一定意味着模型将代表数据库中的表或映射器中的实体。
问题是,在模型中,您可以对视图中可能需要的任何必要数据类型进行分组,因此当在视图中访问模型时,您会以强类型的方式获得所需的所有数据。
以您所说的电影为例,我将为强类型视图创建的模型类似于:
public class MovieModel
{
public int MovieId {get; set;}
public string MovieName {get; set;}
public IEnumerable<CommentModel> MovieComments {get; set;}
}
public class CommentModel
{
public int CommentId {get; set;}
public int CommentText {get; set;}
}
所以在我看来,我可以像这样循环浏览我的电影评论:
@model MovieModel
foreach(var comment in Model.MovieComments)
{
//Do somthing with your comments
}
当然首先在你的控制器上填充你的 MovieModel,让我们说一下编辑动作:
public ActionResult Edit(int id)
{
var _Movie = Movie.GetMovieById(id);
var _Comments = Comments.GetCommentsByMovieId(id);
var _MovieModel = new MovieModel();
_MovieModel.MovieId = _Movie.MovieId;
_MovieModel.MovieName = _Movie.MovieName;
_MovieModel.MovieComments = (from Comment _Comment in _Comments select new
CommentModel{ CommentId = _Comment.CommentId , CommentText = _Comment.CommentText }).ToList();
return View(_MovieModel);
}
当然,您可以直接在 MovieModel 类上使用评论实体,这样您就不需要 CommentModel,它类似于:
public class MovieModel
{
public int MovieId {get; set;}
public string MovieName {get; set;}
public IEnumerable<Comment> MovieComments {get; set;}
}
而你的行为就像:
public ActionResult Edit(int id)
{
var _Movie = Movie.GetMovieById(id);
var _Comments = Comments.GetCommentsByMovieId(id);
var _MovieModel = new MovieModel();
_MovieModel.MovieId = _Movie.MovieId;
_MovieModel.MovieName = _Movie.MovieName;
_MovieModel.MovieComments = _Comments;
return View(_MovieModel);
}
与前一种情况一样,在同一个强类型视图上只得到一个模型和来自不同表的数据,尽管有些人可能会说你这样做违反了一些 MVC 概念是完全可能的......
希望能有所帮助