C# 下拉列表中的值不保存预先存在的值
我正在开发一个MVC5应用程序,它在某个页面上有大量的下拉列表。当我第一次创建记录时,所有信息都存在。但是,如果我编辑了记录,即使页面显示了当前的有效信息,一旦记录被保存,信息也会消失。我调试了post controller操作,看起来ID正在传递到数据库,但我不确定这里发生了什么 这是受影响页面的模型C# 下拉列表中的值不保存预先存在的值,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我正在开发一个MVC5应用程序,它在某个页面上有大量的下拉列表。当我第一次创建记录时,所有信息都存在。但是,如果我编辑了记录,即使页面显示了当前的有效信息,一旦记录被保存,信息也会消失。我调试了post controller操作,看起来ID正在传递到数据库,但我不确定这里发生了什么 这是受影响页面的模型 [Table("facility.PlannerRequest")] public class FacilityPlannerRequest { public int Id { get;
[Table("facility.PlannerRequest")]
public class FacilityPlannerRequest
{
public int Id { get; set; }
[Display(Name = "Work Type")]
public int? WorktypeId { get; set; }
[Display(Name = "Requestor")]
public int? RequestorId { get; set; }
[Display(Name = "Hardware Location")]
public int? EquipmentLocationId { get; set; }
[Display(Name = "Model")]
public int? HardwareModelId { get; set; }
[Display(Name = "Manufacturer")]
public string FreeManufacturer { get; set; }
[Display(Name = "Series")]
public string FreeSeries { get; set; }
[Display(Name = "Model")]
public string FreeHardwareModel { get; set; }
[Display(Name = "Cost Center")]
public int? CostCenterId { get; set; }
[Display(Name = "Cost Center")]
public string FreeCostCenter { get; set; }
[Display(Name = "Client")]
public string ClientName { get; set; }
[Display(Name = "RDI/WLP")]
public string RDIWLPNumber { get; set; }
[Display(Name = "Associated System")]
public string AssociatedSystem { get; set; }
[Display(Name = "Breaker Size")]
public int? BreakerSize { get; set; }
[Display(Name = "Number Of Poles")]
public int? NumberOfPoles { get; set; }
[Display(Name = "Connector Type")]
public int? ConnectorId { get; set; }
[Display(Name = "Connector Location")]
public int? ConnectorLocationId { get; set; }
public string Instructions { get; set; }
[Display(Name = "Status")]
public int? StatusId { get; set; }
[Display(Name = "Work Start Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? WorkStartDate { get; set; }
[Display(Name = "Work Comp Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? WorkCompletedDate { get; set; }
[Display(Name = "Date Entered")]
public DateTime? EnteredDate { get; set; }
[Display(Name = "Last Modified")]
public DateTime? LastModified { get; set; }
public virtual FacilityRequestor Requestor { get; set; }
public virtual FacilityHardwareRequestDescription WorkType { get; set; }
public virtual FacilityLocation EquipmentLocation { get; set; }
public virtual HardwareModel Model { get; set; }
public virtual FacilityCostCenter CostCenter { get; set; }
public virtual HardwareConnector Connector { get; set; }
public virtual FacilityLocation ConnectorLocation { get; set; }
public virtual FacilityPlannerRequestStatus PlannerRequestStatus { get; set; }
ShopDb db = new ShopDb();
public virtual SelectList RequestorList
{
get
{
var activeRequestors = (from r in db.FacilityRequestors
where !r.Deleted
select r).OrderBy(f => f.FacilityEmployee.FirstName);
return new SelectList(activeRequestors, "Id", "FullName");
}
}
public virtual SelectList WorkTypeList
{
get { return new SelectList(db.FacilityHardwareRequestDescriptions, "Id", "WorkType"); }
}
public virtual SelectList ConnectorList
{
get { return new SelectList(db.HardwareConnectors, "Id", "Type"); }
}
public virtual SelectList RequestStatusList
{
get { return new SelectList(db.FacilityPlannerRequestStatuses, "Id", "Status"); }
}
}
上述模型用于创建过程,对于编辑视图模型,我使用:
公共类EditPlannerRequestViewModel
{
公共int Id{get;set;}
[Display(Name = "Requestor")]
public int? RequestorId { get; set; }
[Display(Name = "Work Type")]
public int? WorktypeId { get; set; }
[Display(Name = "Hardware Location")]
public int? EquipmentLocationId { get; set; }
[Display(Name = "Model")]
public int? HardwareModelId { get; set; }
[Display(Name = "Manufacturer")]
public string FreeManufacturer { get; set; }
[Display(Name = "Series")]
public string FreeSeries { get; set; }
[Display(Name = "Model")]
public string FreeHardwareModel { get; set; }
[Display(Name = "Cost Center")]
public int? CostCenterId { get; set; }
[Display(Name = "Cost Center")]
public string FreeCostCenter { get; set; }
[Display(Name = "Client")]
public string ClientName { get; set; }
[Display(Name = "RDI/WLP")]
public string RDIWLPNumber { get; set; }
[Display(Name = "Associated System")]
public string AssociatedSystem { get; set; }
[Display(Name = "Breaker Size")]
public int? BreakerSize { get; set; }
[Display(Name = "Number Of Poles")]
public int? NumberOfPoles { get; set; }
[Display(Name = "Connector Type")]
public int? ConnectorId { get; set; }
[Display(Name = "Connector Location")]
public int? ConnectorLocationId { get; set; }
public string Instructions { get; set; }
[Display(Name = "Work Start Date")]
public DateTime WorkStartDate { get; set; }
[Display(Name = "Work Comp Date")]
public DateTime WorkCompletedDate { get; set; }
public virtual FacilityRequestor Requestor { get; set; }
public virtual FacilityHardwareRequestDescription WorkType { get; set; }
public virtual FacilityLocation EquipmentLocation { get; set; }
public virtual HardwareModel Model { get; set; }
public virtual FacilityCostCenter CostCenter { get; set; }
public virtual HardwareConnector Connector { get; set; }
public virtual FacilityLocation ConnectorLocation { get; set; }
public virtual FacilityPlannerRequestStatus PlannerRequestStatus { get; set; }
public virtual SelectList RequestorList { get; set; }
public virtual SelectList WorkTypeList { get; set; }
public virtual SelectList ConnectorList { get; set; }
}
对于我的控制器,我的两种编辑方法是:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var facilityplannerrequest =
Mapper.Map<FacilityPlannerRequest, EditPlannerRequestViewModel>(db.FacilityPlannerRequests.Find(id));
if (facilityplannerrequest == null)
{
return HttpNotFound();
}
return View(facilityplannerrequest);
}
// POST: /PlannerRequests/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="Id,WorkTypeId,RequestorId,EquipmentLocationId,HardwareModelId,FreeManufacturer,FreeSeries,FreeHardwareModel,CostCenterId,FreeCostCenter,ClientName,RDIWLPNumber,AssociatedSystem,BreakerSize,NumberOfPoles,ConnectorId,ConnectorLocationId,Instructions,WorkStartDate,WorkCompletedDate")]EditPlannerRequestViewModel facilityplannerrequest)
{
if (ModelState.IsValid)
{
var plannerRequest= db.FacilityPlannerRequests.Find(facilityplannerrequest.Id);
Mapper.Map(facilityplannerrequest, plannerRequest);
plannerRequest.LastModified = DateTime.UtcNow;
plannerRequest.StatusId = 1;
db.Entry(plannerRequest).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(facilityplannerrequest);
}
public ActionResult编辑(int?id)
{
if(id==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var设施计划请求=
Map(db.FacilityPlannerRequests.Find(id));
if(facilityplannerrequest==null)
{
返回HttpNotFound();
}
返回视图(设施规划请求);
}
//发布:/planner请求/编辑/5
//若要防止套印攻击,请启用要绑定到的特定属性,例如
//更多详细信息请参见http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果编辑([Bind(包括=“Id、WorkTypeId、RequestorId、EquipmentLocationId、HardwareModel、FreeManufacturer、FreeSeries、FreeHardwareModel、CostCenterId、FreeCostCenter、ClientName、RDIWLPNumber、AssociatedSystem、BreakerSize、NumberOfPoles、ConnectorId、ConnectorLocationId、说明、工作开始日期、工作完成日期”)]EditPlannerRequestViewModel设施规划请求)
{
if(ModelState.IsValid)
{
var plannerRequest=db.FacilityPlannerRequests.Find(facilityplannerrequest.Id);
Mapper.Map(设施规划请求、规划请求);
plannerRequest.LastModified=DateTime.UtcNow;
plannerRequest.StatusId=1;
db.Entry(plannerRequest).State=EntityState.Modified;
db.SaveChanges();
返回操作(“索引”);
}
返回视图(设施规划请求);
}
我正在使用automapper映射这些值:
Mapper.CreateMap<FacilityPlannerRequest, EditPlannerRequestViewModel>();
Mapper.CreateMap<EditPlannerRequestViewModel, FacilityPlannerRequest>()
.ForMember(t=> t.EnteredDate, s=> s.Ignore())
.ForMember(t=>t.LastModified, s=> s.Ignore())
.ForMember(t=>t.StatusId, s=> s.Ignore())
.ForMember(t=>t.RequestStatusList,s=>s.Ignore());
Mapper.CreateMap();
Mapper.CreateMap()
.ForMember(t=>t.EnteredDate,s=>s.Ignore())
.FormMember(t=>t.LastModified,s=>s.Ignore())
.ForMember(t=>t.StatusId,s=>s.Ignore())
.ForMember(t=>t.RequestStatusList,s=>s.Ignore());
编辑
值得注意的是,如果我在post方法中逐行查看代码,我可以看到
facilityplannerrequest
正在获取正确的post数据,当我转到automapper行时,这两行的所有内容仍然正确。但是,一旦我通过db.Entry(plannerRequest).State=EntityState.Modified
line,我的信息会被删除,但仅在外键行上。如果我将黄色箭头拖回方法顶部并再次执行,它将替换它最初删除的信息。我不确定这是否会解决您的问题,但您提到删除AutoMapper有帮助。我在使用FormMember函数进行自定义AutoMapper映射时遇到了类似的问题。由于某些原因,信息存储在某种类型的缓存或配置中,并且会忽略任何新映射。我修复该问题的方法是添加Mapper.Reset()
在任何自定义映射之前,我忽略或设置标准之外的映射。希望这有帮助。我发现发生的事情与我的主模型中的虚拟成员有关。由于这些成员是外键,并且是通过直接从数据库获取信息来设置的,所以它们不能真正“设置”由automapper提供。这导致映射程序保留信息时出现问题。一旦我调整视图以不再使用这些成员并随后将其删除,一切似乎都正常运行。这些虚拟成员包括:
public virtual FacilityRequestor Requestor { get; set; }
public virtual FacilityHardwareRequestDescription WorkType { get; set; }
public virtual FacilityLocation EquipmentLocation { get; set; }
public virtual FacilityCostCenter CostCenter { get; set; }
public virtual HardwareConnector Connector { get; set; }
public virtual FacilityLocation ConnectorLocation { get; set; }
public virtual FacilityPlannerRequestStatus PlannerRequestStatus { get; set;}
仅供参考:使用视图模型和
[Bind(Include=“foo”)]
几乎是互斥的。如果您不想更新某些属性,请不要将它们包含在视图模型中。我很清楚,我只是添加了绑定,以查看是否有奇怪的情况发生。它似乎与AutoMapper有关。删除视图模型后,它会按预期工作