[英]MVC Movie Tutorial And Strongly Typed Views
我正在尝试遵循MVC电影教程并了解到目前为止的所有内容。 对于强类型视图,我只是有些困惑。
我想我明白他们的目的。 我只是不确定它们在本教程之外的现实世界中如何工作。
例如,一个强类型视图需要从多个表中获取数据。
可以说本教程中的电影应用程序还有另一个表,例如注释。
在每部电影上,我们要显示评论。
强类型视图如何访问两个不同的模型(我认为它不能)。 解决这种情况的正确方法是什么?
(我已经搜索并且无法真正找到我理解的答案-在该线程中的评论ASP.NET MVC中的强类型视图在主题上有涉及,但我并不真正理解他的答案)
任何帮助将被申请。 谢谢
对于强类型模型(在这种情况下为“视图模型”)从多个模型绘制数据是非常好的。 一个简单的示例可能看起来像这样:
public class SomeViewModel
{
public List<Employee> Employees { get; set; }
public List<Job> Jobs { get; set; }
}
现在,在控制器中,您可以填充每个集合,但您认为合适:
public ActionResult Index()
{
var model = new SomeViewModel();
model.Employees = // ... fetch from database.
model.Jobs = // ... fetch from database.
return View(model);
}
现在,在您看来,您可以像这样访问它们:
@model SomeViewModel
@Html.DisplayFor(m => m.Employees)
@Html.DisplayFor(m => m.Jobs)
我不太记得MVC电影教程,因此可能已经涵盖了。 如果不是,则下一步是为每个模板创建一个显示模板,以便正确显示收藏集。
为此,请按照下列步骤操作:
DisplayTemplates
文件夹(例如,如果您的视图是Home\\Index.cshtml
,则创建文件夹Home\\DisplayTemplates
)。 Employee.cshtml
和Job.cshtml
)。 然后这些模板可能看起来像这样:
Employee.cshtml:
@model Employee
@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Name)
Job.cshtml:
@model Job
@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Name)
显示模板及其对应的编辑器模板足够聪明,足以知道如何处理集合,因此将为集合的每个成员调用这些模板,从而为每个项目渲染模板的内容。
对于它的价值,我生动地记得当我开始使用MVC时试图弄清楚视图模型实际上是多么令人困惑。 从最初设置官方Entity Framework教程的方式来看,它并不清楚(至少对我而言)。 因此,请牢记这 一点,因为这两个答案对我来说都意义非凡。
当我开始使用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,让我们在edit操作中说:
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类上使用comment实体,因此您将不需要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概念。
希望对您有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.