Asp.net mvc 组合两个ViewModel,一个包含单行结果,另一个包含多行结果
我正试图找出如何将我创建的两个Asp.net mvc 组合两个ViewModel,一个包含单行结果,另一个包含多行结果,asp.net-mvc,asp.net-mvc-viewmodel,Asp.net Mvc,Asp.net Mvc Viewmodel,我正试图找出如何将我创建的两个ViewModels组合起来(GameSectionVM和ReleaseInfoVM),然后用数据适当地填充它(我想我知道怎么做)。通常我只是将代码从一个复制到另一个,但让我挂断电话的是,GameSectionVM将只包含DB查询的一行结果,而另一个VM(ReleaseInfoVM)将包含0或更多行结果。我也有点不确定如何用所有数据填充VM,只需要确认我的代码思想在这方面是正确的 GameSectinVM: public class GameSectionVM {
ViewModels
组合起来(GameSectionVM和ReleaseInfoVM),然后用数据适当地填充它(我想我知道怎么做)。通常我只是将代码从一个复制到另一个,但让我挂断电话的是,GameSectionVM将只包含DB查询的一行结果,而另一个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的代码在两个VM合并时会保持不变,但它会变成model.ReleaseInfo
编辑:我忘了注意到每个游戏部分都可以有多个版本,这就是为什么我想合并两个虚拟机,以便传递给视图的单个模型将具有该部分的标题、徽标、概要以及该游戏每个版本的所有发布信息。在数据库级别,两个表(Section和Release)通过
Release连接在一起。SectionID
是FK
到Section.ID
,因为GameSectionVM
和ReleaseInfoVM
看起来一点都不一样,我假设您的意思是创建第三个ViewModel,该ViewModel将单个GameSectionVM
作为属性,将一组ReleaseInfoVM
实例作为另一个属性
这应该相当简单:
public class CombinedVM
{
public GameSectionVM GameSection { get;set;}
public IEnumerable<ReleaseInfoVM> ReleaseInfos { get;set; }
}
如果这是
GameSectionVM
和ReleaseInfoVM
之间的父子关系,那么最简单的方法就是在GameSectionVM
的属性中添加ICollection
public class GameSectionVM
{
...
public ICollection<ReleaseInfoVM> ReleaseInfos {get;set;}
}
抱歉,我应该在帖子中声明,游戏部分将有0或更多发布信息(即多个发布日期/位置),因此这两个应该是同一ViewModel的一部分,但由于游戏部分只有1个标题、徽标和Synopis,但可以有多组发布信息,我不确定如何组合这两个信息。我在原始帖子中添加了一个编辑,在两者之间建立了联系。谢谢,我按照建议添加了一个
ICollection
,但现在获取信息的查询显示它无法从IQueryable转换为ICollectionmodel.ReleaseInfo=(从db.Releases中的r开始,其中r.SectionID==model.SectionID选择new ReleaseInfoVM{}).All();
您可以在VM中使用IQueryable
(您可能需要了解性能问题)或者使用.All().ToList();
public class GameSectionVM
{
...
public ICollection<ReleaseInfoVM> ReleaseInfos {get;set;}
}
// 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
);