And*_*rew 2 .net c# asp.net asp.net-mvc entity-framework
我试图绕过所有这些ViewModel的东西并以正确的方式做事.我有几个模型通过Entity Framework链接到SQL表,如下所示:
[Table("HardwareOptions", Schema = "dbo")]
public class HardwareOption {
[Key]
public int RecordID {get; set;}
[ForeignKey("Configuration")]
public string Configuration {get; set;}
public string ComputerManufacturer {get; set;}
public string ComputerModel {get; set;}
public string ComputerDescription {get; set;}
public int MonitorCount {get; set;}
public string MonitorManufacturer {get; set;}
public string MonitorModel {get; set;}
public string MonitorDescription {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个这样的视图模型:
public class OrderIndexViewModel {
public Customer Customer {get; set;}
public MetaUser MetaUser {get; set;}
public DbSet<HardwareOption> HardwareOptions {get; set;}
public DbSet<Machine> Machines {get; set;}
public DbSet<PendingOrder> PendingOrders {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器有点像这样:
private MyDbContext db = new MyDbContext();
OrderIndexViewModel viewmodel = new OrderIndexViewModel();
viewmodel.Customer = db.Customers.Find("myselffortesting");
viewmodel.MetaUser = db.MetaUsers.Find("myselffortesting");
viewmodel.HardwareOptions = db.HardwareOptions;
viewmodel.Machines = db.Machines;
viewmodel.PendingOrders = db.PendingOrders;
return View(viewmodel);
Run Code Online (Sandbox Code Playgroud)
因此,大家可以看到,在我看来,我只需要大约一个客户/用户的信息,但我需要能够查询整个HardwareOptions,机器和PendingOrders表.现在,如果我的架构完全错误,请告诉我,因为这更像是这个问题.但是对于特定的事情,我想要从HardwareOptions制作一个下拉列表.从技术上讲,我希望每个SelectItem人都说几列的值的字符串组合,但是现在我会说我只想要一个,比如Configuration.这样做的正确方法是什么?我不知道如何操纵DbSet.当我尝试从中创建一个Html.DropDownList时DbSet,我得到了一个包含正确数量的项目的列表,但他们都说"mynamespace.Models.HardwareOption".这是有道理的,我只是无法弄清楚如何正确地做到这一点.
DbSet<T>在您的示例中,您可以使用的有用的东西是投影.您将定义第二个ViewModel,其中包含您要在下拉列表中显示的属性:
public class HardwareOptionViewModel
{
public int Id { get; set; }
public string Configuration { get; set; }
public string AnotherProperty { get; set; }
//...
}
Run Code Online (Sandbox Code Playgroud)
而不是DbSet你在你的使用中使用此ViewModel的集合OrderIndexViewModel:
public class OrderIndexViewModel
{
//...
public IEnumerable<HardwareOptionViewModel> HardwareOptions { get; set; }
//...
}
Run Code Online (Sandbox Code Playgroud)
并且只使用以下Select方法从数据库加载这些属性:
viewmodel.HardwareOptions = db.HardwareOptions
.Select(h => new HardwareOptionViewModel
{
Id = h.Id,
Configuration = h.Configuration,
AnotherProperty = h.AnotherProperty,
//...
})
.ToList();
Run Code Online (Sandbox Code Playgroud)
编辑
您可以将集合绑定到下拉列表,如下所示:
@model MyNamespace.OrderIndexViewModel
...
<div>
@Html.DropDownListFor(model => model.CurrentHardwareOptionId,
new SelectList(Model.HardwareOptions, "Id", "Configuration",
Model.CurrentHardwareOptionId))
</div>
Run Code Online (Sandbox Code Playgroud)
在这里我引入了一个新的属性CurrentHardwareOptionId上OrderIndexViewModel具有相同的类型Id(int在本例中),而应该是所选择的属性Id在下拉列表中应该绑定在页面回发到:
public class OrderIndexViewModel
{
//...
public int CurrentHardwareOptionId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4739 次 |
| 最近记录: |