asp.net-mvc - asp.net core EF 从另一个表中获取数据
问题描述
我有两个模型: Car.cs 和 SiteDefault.cs
public class Car
{
public int CarId { get; set; }
public string CarName { get; set; }
public string Color { get; set; }
}
public class SiteDefault
{
public int SiteDefaultId { get; set; }
public string MainPageBackgroundImg { get; set; }
public string AboutPageBackgroundImg { get; set; }
public string ContactPageBackgroundImg { get; set; }
}
在 Views/Cars/Index.cshtml 中,我使用实体框架轻松列出汽车,并且我想从 SiteDefault 表中设置其背景图像文件名。
实际上,我需要动态更改网站的常规设置(背景、标题等)并轻松获取它们。应该有一个最佳实践
解决方案
如果您需要将各种 EF 数据提取到视图中,您应该创建一个 ViewModel 来表示您需要的所有数据,而不是尝试将 EF 实体直接传递到视图中。您不能将视图绑定到多个模型,因此您不能将 Car 和 SiteDefault 模型作为两个不同的实体拉入。ViewModel 是一个保存这些数据的新类。如果您计划使用这两个模型中的大部分或全部数据,那么您可以创建一个仅包含这两个对象的 ViewModel:
public class CarsViewModel {
public Car Car { get; set; }
public SiteDefault SiteDefault { get; set; }
}
然后在您的 Cars 控制器中,使用 EF 提取数据并将这些对象分配给您的 ViewModel
var car = getCar() // EF
var siteDefault = getSiteDefault // more EF
var viewModel = new CarsViewModel() { Car = car, SiteDefault = siteDefault };
return View(viewModel);
在视图中,您只需将 @model 语句放在顶部并在视图中使用它,就像任何其他模型 (@Model.Car.CarName)
如果您只打算使用每个类中的几个字段,那么您可以只在 ViewModel 中创建这些字段,而不是分配整个对象。这取决于最适合这种情况的方法。
推荐阅读
- amazon-web-services - 通过 SMTP 使用 SES(带 SNS)
- android - 如何使用强制关闭按钮创建持久通知?
- javascript - 我可以使用什么选择器来排除带有后缀的 ID?
- java - [DynamoDB]:我可以使用 DynamoDBMapper 在 DynamoDB 中的多个表之间共享单个数据模型吗?
- java - 尝试定义自定义 PropertyMap 时出现 NullPointerException
- sql - 仅当值存在于 SQL 的另一列中时,如何选择列的值?
- java - 为从 Java 调用 SWIG 生成的 C 桥预先分配缓冲区?
- java - 如何仅使用 Java 在 vaadin 中创建 spring 安全登录页面?
- sonarqube - 如何禁用基于 Sensor ESLint 的 SonarJS?
- python - MongoDB集合设计