返回ViewModel而不是Model

3
以下方法返回一个名为PROFIEnumerableMODEL
我想使用一个包含与Model PROF相同字段的ViewModel,而不是使用这个模型。我应该如何修改下面的函数来返回我的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; }
    }

模型

public class PROF
    {


        public int ID{ get; set; }

        public string DESCRIPTION { get; set; }
    }

1
也许你只需要将模型“映射”到视图模型并返回它...? - kayess
你能告诉我怎么做吗?我是新手。 - Illep
如果属性实际上被命名为“相同”(而不仅仅是相似),那么您可以使用AutoMapper和ProjectToListAsync<MyProfViewModel>()扩展方法 - Charles Mager
@CharlesMager,你能给我更多关于AutoMapper的细节吗?你的意思是如果我在模型和视图模型中都使用了相同的属性名称? - Illep
@CharlesMager 这是一个可以被认为是好的建议,然而我想要补充一点,对于 OP 和未来的访问者来说,你需要权衡引入另一层抽象/工具的利弊,仅仅为了映射这样简单的任务。JoelHarkes 的回答展示了比 Auto- 或其他映射工具更简单、可能更快的方法。 - kayess
1
@Illep 如果你想了解更多关于AutoMapper的信息,可以访问官网或使用谷歌搜索大量博客、教程和问题等。此外,请注意上面kayess的建议。如果你发现自己正在编写大量机械化的映射代码,那么AutoMapper可以成为一个很好的时间节省工具,但可能不适合只有一个简单用例的情况下引入。 - Charles Mager
2个回答

5

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类来将转换应用于模型:
    public PROF ToModel()
    {
        return new PROF()
        {
            ID = this.myprofID,
            DESCRIPTION = this.myprofDes
        };
    }

希望这能有所帮助!

是的。谢谢。帮了很大的忙。 - Illep

3
添加一个选择语句,将一种类型映射到另一种类型:
db.PROF.Include(c => c.ACCOUNTS)
       .Select(x=> new MyProfViewModel(){myprofID = x.ID, ...});

根据您的ORM层(Entity Framework?)是否支持此select语句,我会在.ListAsync();之前或之后执行它。

优点:在之前执行可以导致更好优化的SQL查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接