MVC电影教程和强类型视图

时间:2013-11-15 03:23:54

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试关注MVC电影教程并了解到目前为止的所有内容。我对有关强类型视图的事情感到有些困惑。

我想我理解他们的目的。我只是不确定它们如何在本教程之外的现实生活场景中工作。

例如,需要从多个表中获取数据的强类型视图。

让我们说教程中的电影应用程序还有另一个名为comments的表。

在每部电影中我们都要显示评论。

强类型视图如何访问两个不同的模型(我认为它不能)。解决这种情况的正确方法是什么。

(我已经搜索过并且无法找到我理解的答案 - 这篇帖子中的评论What is strongly-typed View in ASP.NET MVC触及了这个主题,但我真的不明白他的答案)

任何帮助都会得到满足。感谢

2 个答案:

答案 0 :(得分:2)

对于强类型模型(在这种情况下为“视图模型”)从多个模型中绘制数据非常好。一个简单的例子看起来像这样:

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电影教程,所以这可能已经涵盖了。如果没有,下一步是为每个创建一个显示模板,以便正确显示集合。

为此,请按照以下步骤操作:

  1. 在视图的当前文件夹中创建一个DisplayTemplates文件夹(例如,如果您的视图为Home\Index.cshtml,请创建文件夹Home\DisplayTemplates)。
  2. 在该目录中创建一个强类型视图,其名称与您的模型匹配(即在上面的示例中,您将创建两个视图,分别称为Employee.cshtmlJob.cshtml
  3. 然后这些模板看起来像这样:

    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时,试图弄清楚视图模型实际上是多么令人困惑。从最初设置官方实体框架教程的方式来看,它没有说清楚(至少对我而言)。因此,考虑到这一点,请阅读thisthis,因为这两个答案都为我清理了很多。

答案 1 :(得分:0)

当我开始使用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类上使用comments实体,这样您就不需要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概念的,但这样做是完全可能的....

希望有所帮助