Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 下拉列表中的值不保存预先存在的值_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 下拉列表中的值不保存预先存在的值

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;

我正在开发一个MVC5应用程序,它在某个页面上有大量的下拉列表。当我第一次创建记录时,所有信息都存在。但是,如果我编辑了记录,即使页面显示了当前的有效信息,一旦记录被保存,信息也会消失。我调试了post controller操作,看起来ID正在传递到数据库,但我不确定这里发生了什么

这是受影响页面的模型

[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有关。删除视图模型后,它会按预期工作