组合两个ViewModel,1包含单行结果,另一个包含多行结果

时间:2014-04-07 23:54:53

标签: asp.net-mvc asp.net-mvc-viewmodel

我试图找出如何组合我创建的ViewModels中的两个(GameSectionVM和ReleaseInfoVM),然后用数据填充它(我想我知道该怎么做)。通常我只是将代码从一个复制到另一个但是让我挂起的是GameSectionVM只包含数据库查询的单行结果,而另一个VM(ReleaseInfoVM)包含0行或更多行的事实结果。我也不确定如何用所有数据填充VM,只需要确认我的代码认为是正确的。

GameSectinVM:

public class GameSectionVM
{
    public string GameTitle { get; set; }
    public string LogoFileName { get; set; }
    public string Synopsis { get; set; }
}

ReleaseInfoVM

public class ReleaseInfoVM
{
    public Int16 SectionID { get; set; }
    public string ReleaseName { get; set; }
    public string Platform { get; set; }
    public string Publisher { get; set; }
    public string Location { get; set; }
    [HiddenInput]
    public DateTime? ReleaseDate { get; set; }
    [HiddenInput]
    public string ReleaseDateText { get; set; }
    public string DateReleased
    {
        get
        {
            return (ReleaseDate.HasValue) ? ReleaseDate.ToString() : ReleaseDateText;
        }
    }
}

这是我目前用来填充两个虚拟机的代码:

var model = (from s in db.Sections
            join f in db.Files
            on s.LogoFileID equals f.ID into s_f
            where s.RouteName == SectionName
            from x in s_f.DefaultIfEmpty()
            select new GameSectionVM
            {
                GameTitle = s.Title,
                LogoFileName = x.FileName,
                Synopsis = s.Synopsis
            }).Single();
var ReleaseInfo = db.Releases.All(r => r.SectionID == SectionID);

我会对代码进行映像以填充ReleaseData,当两个虚拟机组合在一起时,它将保持不变,而不是var ReleaseInfo它将成为model.ReleaseInfo

编辑:我忘记了每个游戏部分可以有多个版本,这就是为什么我想要合并两个虚拟机,以便传递给视图的单个模型将具有该部分的标题,徽标,概要,以及该游戏每个版本的所有发布信息。在数据库级别,两个表(部分和发布)由Release.SectionID FKSection.ID

绑定在一起

2 个答案:

答案 0 :(得分:1)

如果这是父母 - > GameSectionVMReleaseInfoVM之间的子关系,最简单的方法是在ICollection<ReleaseInfoVM>的属性中添加GameSectionVM

public class GameSectionVM
{
...
public ICollection<ReleaseInfoVM> ReleaseInfos {get;set;}
}

填充VM的代码:

// this var will evaluate to GameSectionVM
var model = (from s in db.Sections
...
}).Single();

model.ReleaseInfos = (from r in db.Releases
...
// Do your query logic to populate the ReleaseInfoVM tables here
);

答案 1 :(得分:0)

鉴于GameSectionVMReleaseInfoVM看起来彼此不一样,我认为你的意思是创建一个第三个ViewModel,它有一个GameSectionVM作为属性和一个ReleaseInfoVM个实例的集合作为另一个属性。

这应该是相当简单的:

public class CombinedVM
{ 
    public GameSectionVM GameSection { get;set;}

    public IEnumerable<ReleaseInfoVM> ReleaseInfos { get;set; }
}

...假设您已经检索了GameSectionVMReleaseInfoVM个实例列表,您可以像这样构建模型:

 var newModel = new CombinedVM() { GameSection = model, ReleaseInfos = ReleaseInfo };