c# - 将 IQueryable 传递给 ViewModel 的错误做法

标签 c# asp.net-mvc

我可能对这里的 ViewModel 有一些误解(我是新手),但是将静态 Get 方法传递给 IQueryable 是一种不好的做法吗?我还没有尝试过这个,所以我不确定它是否会起作用,但这是一个关于 ViewModels 用法的更大问题。

例如:

using (var db = something.Invoke()) {
    var query = some query;
    var data = MyViewModel.Get(query); //pass an IQueryable

    //do something with data
}

class MyViewModel {
    public List<int> Something {get; set;}

    public static MyViewModel Get(IQueryable data) {
        var view = new MyViewModel();
        var list = new List<int>();
        foreach (var d in data) {
            list.Add(d.Column);
        }
        view.Something = list;
        return view;
    }
}

将我的数据库映射到更通用的数据结构,然后将其传递到我的 ViewModel 以执行另一个映射(如数据库 -> 列表 -> ViewModel)似乎真的是多余的。如果我可以只传递我的查询并让 100% 的映射发生在 ViewModel 中,而不是在中间步骤(数据库 -> ViewModel)中进行,那就更容易了。

最佳答案

我们曾尝试在 ViewModel 中使用逻辑,但这是一条疯狂的道路。

ViewModels 应该是 POCO——只有没有(或非常基本的)逻辑的属性。所有映射都应在 Controller 中完成,甚至在 Controller 调用的 QueryHanlder 中完成。 QueryHanlder 将依赖于 DB 并进行必要的映射以从 DB 数据结构获取 ViewModel。

ViewModel 的职责是将数据从 Controller 传输到 View (或向后)。并且如果你将 DB 或映射逻辑放入其中,这将违反单一职责原则。

关于c# - 将 IQueryable 传递给 ViewModel 的错误做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246583/

相关文章:

asp.net-mvc - 没有为此对象定义无参数构造函数?

c# - 获取在 C# 中创建的进程的 pid

c# - ASP.NET Core 2.1 中的策略和声明

c# - 创建并流式传输图像存档 zip 文件以供下载 C#

使用非侵入式验证时 jQuery 验证未执行

c# - ASP.NET MVC 4 : Only allow one request at a time

c# - Enum.TryParse 和 Enum.IsDefined 为 char 枚举返回 false

用于 ASP.Net 的 HTML 中的 C# 代码编辑器

c# - MVC 自定义验证工作但不显示错误

javascript - Ajax 文件上传的奇怪问题(jQuery、ASP.Net MVC)