【问题标题】:What exactly should a model contain in MVC?模型在 MVC 中究竟应该包含什么?
【发布时间】:2019-12-22 19:07:56
【问题描述】:

我最近一直在阅读 Microsoft 关于 ASP.NET Core 的教程,并看到该教程的控制器类包含 LINQ 查询以从数据库中获取数据。例如,该教程的代码 sn-p 如下所示:


// GET: Movies
public async Task<IActionResult> Index(string movieGenre, string searchString)
{
    // Use LINQ to get list of genres.
    IQueryable<string> genreQuery = from m in _context.Movie
                                    orderby m.Genre
                                    select m.Genre;

    var movies = from m in _context.Movie
                 select m;

    if (!string.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    if (!string.IsNullOrEmpty(movieGenre))
    {
        movies = movies.Where(x => x.Genre == movieGenre);
    }

    var movieGenreVM = new MovieGenreViewModel
    {
        Genres = new SelectList(await genreQuery.Distinct().ToListAsync()),
        Movies = await movies.ToListAsync()
    };

    return View(movieGenreVM);
}

我的问题如下:模型类究竟包含什么?在我阅读的所有关于 MVC 模式的文章中,我被建议将我从数据库中获取数据的函数放入模型类中。那么他们在本教程中做错了吗?

【问题讨论】:

  • 你的模型应该是你的实体。在您的示例中,模型是您在其中查询数据库的 Movie 实体。这应该存在于 Models 文件夹中。不是数据库查询。只是包含所有属性的 Movie 类。
  • 我认为“MVC”框架隐藏了这一点,但获取/更新通常发生得更晚,而且有点在幕后......(不是当你执行 LINQ 查询时...... lambda 在那里隐藏了很多...当调用 .ToList 时可能会完成获取?所以框架中有一个超级模型处理所有这些数据库调用)“movieGenreVM”模型是一个“视图模型”,只是数据在视图中使用。
  • 另见这篇文章来自对 MVC 在 Web 上下文中的含义有更深入理解的人:stackoverflow.com/questions/5863870/…

标签: asp.net-core model-view-controller asp.net-core-mvc


【解决方案1】:

模型类是 DTO,您可以在此处阅读有关它们的更多信息:https://docs.microsoft.com/en-us/aspnet/web-api/overview/data/using-web-api-with-entity-framework/part-5

您的代码中没有错误,这只是一种不好的做法。实体和 DTO 之间的主要区别在于您没有提及与另一个 DTO 的关系。例如,当我们谈论实体时,我们有

public class Author{
public string name{get; set;}
public List<Book> Books {get; set;}
}

但是当我们谈论 DTO 时,我们将只有

public class Author{
    public string name{get; set;}
    }

代码将运行,但您不想获取实体的全部属性,只获取少数且显然不是与其相关的实体。如果您使用他们提供的版本,则代码将需要更多时间来编译并且容易出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2012-08-18
    • 2011-12-12
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多