从视图模型内初始化子视图模型
本文关键字:视图 模型 初始化 | 更新日期: 2023-09-27 18:31:56
我有我的IndexViewModel
,它将(当前)一个字段发送到视图
-
List<StaffMemberViewModel> StaffMembers
StaffMemberViewModel
只持有员工的全名以及他们的公司头衔。
所有员工数据都包含在 JSON 文件中(但同样容易地包含在数据库中)。
以下是我目前构建IndexViewModel
的方式
public class IndexViewModel : LayoutViewModel
{
public IndexViewModel()
{
// initialize _staffMembers
_staffMembers = new List<StaffMemberViewModel>();
var staffModel = new JsonFileReader()
.GetModelFromFile<List<Staff>>
(@"~/App_Data/Staff.json");
foreach (var member in staffModel)
{
_staffMembers.Add(new StaffMemberViewModel
{
FullName = string.Format("{0} {1} {2}", member.FirstName, member.MiddleInitial, member.LastName),
CorporateTitle = member.CorporateTitle
});
}
}
private readonly List<StaffMemberViewModel> _staffMembers;
public List<StaffMemberViewModel> StaffMembers {get {return _staffMembers;}}
}
public class StaffMemberViewModel
{
public string FullName { get; set; }
public string CorporateTitle { get; set; }
}
然后在控制器中,我只使用这样的东西。
[HttpGet]
public ActionResult Index()
{
var viewModel = new IndexViewModel;
return View(viewModel);
}
如果我希望我的代码遵循 S.O.L.I.D 原则,我怎样才能更好地连接它?请记住,控制器应该是薄的,因此我不想通过调用 json 文件来膨胀控制器。我应该创建一个服务来填充StaffMemberViewModel
吗?
我还应该注意:IndexViewModel 继承自一个抽象LayoutViewModel
,其中包含页面标题和其他可重用属性等内容。为了简洁起见,我没有展示它。我还将向 IndexViewModel 添加更多属性,因此通过删除 IndexViewModel 层并直接转到StaffMemberViewModel
来解决此问题不是一个有效的解决方案。
看起来 StaffMemberViewModel 实际上是一个模型?它是您的视图模型尝试显示的模型。至于连接它,我会做一些整理和依赖注入,以及创建一个映射器工厂:
public class IndexViewModel : LayoutViewModel
{
public IndexViewModel(IEnumerable<StaffModel> staffModel)
{
_staffMembers = StaffModelMapperFactory.Map(staffModel);
}
private readonly List<PartialStaffViewModel> _staffMembers;
public List<PartialStaffViewModel> StaffMembers {get {return _staffMembers;}}
}
public class PartialStaffViewModel
{
public string FullName { get; set; }
public string CorporateTitle { get; set; }
}
public class StaffModelMapperFactory
{
public static List<PartialStaffViewModel> Map(IEnumerable<StaffModel> staff)
{
return staff.Select(member => new PartialStaffViewModel
{
FullName = string.Format("{0} {1} {2}", member.FirstName, member.MiddleInitial, member.LastName),
CorporateTitle = member.CorporateTitle
}).ToList();
}
}
[HttpGet]
public ActionResult Index()
{
var staffModel = new JsonFileService().ReadFileToModel<List<StaffModel>>(@"~/App_Data/Staff.json");
var model = new IndexViewModel(staffModel)
{
Title = "Future State Mobile"
};
return View(model);
}