c# – MVC中的ViewModels和对象操作
我想理解(最后欣赏,因为现在只是痛苦…)MVC中的更多ViewModel和强类型视图.
我的ViewModel public class Combined { public IEnumerable<Domain> Domains { get; set; } public IEnumerable<RegInfo> RegInfos { get; set; } public Combined(IEnumerable<Domain> domains,IEnumerable<RegInfo> reginfos) { this.Domains = domains; this.RegInfos = reginfos; } 在Controller中,我将数据从存储库传递给Combined类型的对象. public ActionResult RegDetails(int id = 0) { var domain = from x in unitofwork.DomainRepository.Get(n => n.ID == id) select x; var reginfo = from y in unitofwork.ReginfoRepository.Get(n => n.ID == id) select y; var regdetails = new Combined(domain,reginfo); return View(regdetails); } 在一个视图中(使用Razor)我有@model project.namespace.Combined所以我传递了一个包含两个列表的对象. 1 /为什么我不能像这样访问每个列表项@ Model.Domain.Name(noobish question但请帮助我理解它背后的逻辑)?我可以通过使用连接来查看“级别”,但它完全违反MVC模式.我认为只有连接这两个表的地方是在Controller中,但它会创建一个全新的对象,所以我需要为它创建一个模型吗? 2 /获取IEnumerable对象的最佳方法是什么,该对象将保存来自2个或更多表的数据,这些表可用于填充View(join,automapper)? 3 /是否有一种方法可以让我创建一个模型,我可以使用它来从一个FORM POST到多个表? 提前致谢. 解决方法
在控制器动作中获取实体的逻辑很好;这是控制器的工作.但是,您不需要在视图模型上使用自定义构造函数:只需使用对象初始化.
var regdetails = new Combined { Domains = domain,RegInfos = reginfo } 现在,就您的视图模型而言,Domains和RegInfos是IEnumerables,但您只为每个提取一个对象.如果您打算使用列表类型,那么您应该修改LINQ以选择多个项目,但如果您的意图实际上只是每个项目只有一个对象,则不应在视图模型中使用IEnumerables. public class Combined { public Domain Domain { get; set; } public RegInfo RegInfo { get; set; } } 如果这样做,那么您将能够使用@ Model.Domain.Name访问Domain实例上的Name属性.但是,如果你保留它们列表类型,那么你必须在视图中循环它们(即使列表中只有一个项目): @foreach (var domain in Model.Domains) { // Do something with domain.Name } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |