Return ViewModel 而不是 Model

Return ViewModel instead of Model

以下方法 returns 一个 IEnumerable MODEL 调用 PROF.

我不想使用模型,而是想使用包含与 Model PROF 相同字段的 viewModel。我如何更改以下功能 return 我的 VIEWMODEL(称为 MyProfViewModel )而不是 model (称为 PROF )。

public async Task<ActionResult> Index()
{
    var cp= db.PROF.Include(c => c.ACCOUNTS);

    return View(await cp.ToListAsync());
}

ViewModel

public class MyProfViewModel
    {


        public int myprofID { get; set; }

        public string myprofDes{ get; set; }
    }

型号

public class PROF
    {


        public int ID{ get; set; }

        public string DESCRIPTION { get; set; }
    }

添加 select 将一种类型映射到另一种类型的语句:

db.PROF.Include(c => c.ACCOUNTS)
       .Select(x=> new MyProfViewModel(){myprofID = x.ID, ...});

根据您的 ORM 层是否支持此 select 语句(Entity Framework?),我会在 .ListAsync();

之前或之后执行此操作

之前的优点:可以更好地优化 SQL 查询。

Joel 的回答差不多就是这样。但是既然你说你是入门我会提供更详细的答案,让使用更清楚。

首先你定义一个转换,在本例中我把它放在 ViewModel 中,但你可以把它放在其他对你的项目更有意义的地方:

public class MyProfViewModel
{
    public int myprofID { get; set; }

    public string myprofDes { get; set; }

    public static MyProfViewModel FromModel(PROF model)
    {
        var viewModel = new MyProfViewModel()
        {
            myprofID = model.ID,
            myprofDes = model.DESCRIPTION
        };
        return viewModel;
    }
}

然后您只需在返回前应用转换:

    public async Task<ActionResult> Index()
    {
        var cp = PROF.Include(c => c.ACCOUNTS);
        var models = await cp.ToListAsync();

        var viewModels = models.Select(MyProfViewModel.FromModel);

        return View(viewModels);
    }

顺便说一下,您也可以通过将其添加到您的 ViewModel 来转换为模型 class:

    public PROF ToModel()
    {
        return new PROF()
        {
            ID = this.myprofID,
            DESCRIPTION = this.myprofDes
        };
    }

希望对您有所帮助!