C# 表达式中的模型与ViewData中的模型不同

C# 表达式中的模型与ViewData中的模型不同,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我对ViewModel上的编辑视图有点问题。当我第一次将编辑视图发布到服务器时,它需要使用附加了数据库ID的相同ViewModel再次返回编辑视图 这是相应控制器中的编辑方法: [HttpPost] public ActionResult Edit(InvoiceDetailsViewModel invoice) { using (var context = new HyperContext(WebSecurity.CurrentUserId)) { if (ModelState.I

我对ViewModel上的编辑视图有点问题。当我第一次将编辑视图发布到服务器时,它需要使用附加了数据库ID的相同ViewModel再次返回编辑视图

这是相应控制器中的编辑方法:

[HttpPost]
public ActionResult Edit(InvoiceDetailsViewModel invoice) {
  using (var context = new HyperContext(WebSecurity.CurrentUserId)) {
    if (ModelState.IsValid) {
      if (invoice.ID == 0) {
        var dbItem = Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice);
        context.Invoices.Add(dbItem);
        context.SaveChanges();
        var newInvoice = Mapper.Map<InvoiceDetailsViewModel>(dbItem);
        FillViewBag(context, newInvoice);
        newInvoice.Description = "TEST";
        return PartialView(newInvoice);
      }
      else {
        context.Entry(Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice)).State = System.Data.EntityState.Modified;
        context.SaveChanges();
        return Content(Boolean.TrueString);
      }
    }
    FillViewBag(context, invoice);
    return PartialView(invoice);
  }
}
首次呈现此视图时,包含
LoadList
调用的脚本元素不在输出中。发布表单并使用更新的viewmodel呈现视图时,该元素将出现在输出中。但是,包含发票ID的隐藏字段仍然显示0。因此,本质上,这里发生的是,ViewData字典中的模型对象是正确的版本,表达式中使用的对象似乎是另一个较旧的版本


有人愿意解释一下,并给我指出正确的方向吗?

据报道,这似乎是故意的行为

概要:HTMLHelper将首先使用POST中的值,然后使用实际模型中的值。在控制器方法中将它们从ModelState中删除可以实现以下目的:

[HttpPost]
public ActionResult Edit(InvoiceDetailsViewModel invoice) {
  using (var context = new HyperContext(WebSecurity.CurrentUserId)) {
    if (ModelState.IsValid) {
      if (invoice.ID == 0) {
        ModelState.Remove("ID");
        ModelState.Remove("Created");
        ModelState.Remove("CreatedBy");
        ModelState.Remove("Modified");
        ModelState.Remove("ModifiedBy");
        var dbItem = Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice);
        context.Invoices.Add(dbItem);
        context.SaveChanges();
        invoice = Mapper.Map<InvoiceDetailsViewModel>(dbItem);
        FillViewBag(context, invoice);
        return PartialView(invoice);
      }
      else {
        context.Entry(Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice)).State = System.Data.EntityState.Modified;
        context.SaveChanges();
        return Content(Boolean.TrueString);
      }
    }
    FillViewBag(context, invoice);
    return PartialView(invoice);
  }
}
[HttpPost]
公共操作结果编辑(发票详细信息查看模型发票){
使用(var context=new超上下文(WebSecurity.CurrentUserId)){
if(ModelState.IsValid){
如果(invoice.ID==0){
ModelState.Remove(“ID”);
ModelState.Remove(“创建”);
ModelState.Remove(“CreatedBy”);
ModelState.Remove(“修改”);
ModelState.Remove(“ModifiedBy”);
var dbItem=Mapper.Map(发票);
context.Invoices.Add(dbItem);
SaveChanges();
发票=映射器.Map(dbItem);
FillViewBag(上下文、发票);
返回部分视图(发票);
}
否则{
context.Entry(Mapper.Map(invoice)).State=System.Data.EntityState.Modified;
SaveChanges();
返回内容(Boolean.TrueString);
}
}
FillViewBag(上下文、发票);
返回部分视图(发票);
}
}

在本例中,您在哪里调用ViewData模型?您是否检查了var newInvoice在控制器中的ID是否与0不同?Model.ID在viewdata中调用该模型。我已经用调试器检查了一切,一切都很好。据我所知,我唯一无法检查的是lambda表达式,它们不正确。Model.ID和m=>m.ID使用相同的模型,您将其传递到PartialView(…)调用(该调用在内部通过ViewData传递)。为什么要用FillViewBag手动将同一个模型存储在ViewBag中?FillViewBag并没有做到它的名字所暗示的那样:)它只是在viewmodel中设置了一个属性,并且正在进行重构。我发现很难相信Model.ID和m=>m.ID使用相同的对象,因为结果将是我所期望的。目前模型是新版本,m是旧版本,所以说。。。
[HttpPost]
public ActionResult Edit(InvoiceDetailsViewModel invoice) {
  using (var context = new HyperContext(WebSecurity.CurrentUserId)) {
    if (ModelState.IsValid) {
      if (invoice.ID == 0) {
        ModelState.Remove("ID");
        ModelState.Remove("Created");
        ModelState.Remove("CreatedBy");
        ModelState.Remove("Modified");
        ModelState.Remove("ModifiedBy");
        var dbItem = Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice);
        context.Invoices.Add(dbItem);
        context.SaveChanges();
        invoice = Mapper.Map<InvoiceDetailsViewModel>(dbItem);
        FillViewBag(context, invoice);
        return PartialView(invoice);
      }
      else {
        context.Entry(Mapper.Map<eu.ecmt.RecruitmentDatabase.Models.Invoice>(invoice)).State = System.Data.EntityState.Modified;
        context.SaveChanges();
        return Content(Boolean.TrueString);
      }
    }
    FillViewBag(context, invoice);
    return PartialView(invoice);
  }
}