返回ViewModel而不是Model

时间:2017-01-06 09:09:02

标签: c# linq viewmodel

以下方法返回名为IEnumerable的{​​{1}} MODEL

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

PROF

视图模型

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

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

模型

public class MyProfViewModel
    {


        public int myprofID { get; set; }

        public string myprofDes{ get; set; }
    }

2 个答案:

答案 0 :(得分:5)

乔尔的答案就是这样。但既然你提到你正在开始,我会提供一个更加三角形的答案,以便更清楚地说明如何使用。

首先你定义一个转换,在这种情况下我将它放在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类来转换为模型:

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

希望这有帮助!

答案 1 :(得分:3)

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

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

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

之前或之后执行此操作

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