1

我正在尝试遵循 MVC 电影教程并了解到目前为止的所有内容。关于强类型视图,我只是有点困惑。

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

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

例如,假设教程中的电影应用程序有另一个表,称为评论。

我们希望在每部电影上显示评论。

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

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

任何帮助都将不胜感激。谢谢

4

2 回答 2

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)。

然后这些模板可能看起来像这样:

员工.cshtml:

@model Employee

@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Name)

作业.cshtml:

@model Job

@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Name)

显示模板及其对应的编辑器模板足够聪明,知道如何处理集合,因此将为集合的每个成员调用这些模板,为每个项目呈现模板的内容。

对于它的价值,我清楚地记得当我开始使用 MVC 时,试图弄清楚视图模型到底是什么是多么令人困惑。从最初设置官方实体框架教程的方式来看,它并没有说清楚(至少对我来说)。因此,考虑到这一点,请阅读thisthis,因为这两个答案对我来说都清楚了很多。

于 2013-11-15T03:30:07.553 回答
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 类上使用评论实体,这样您就不需要 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 概念是完全可能的......

希望能有所帮助

于 2013-11-15T04:40:34.370 回答