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

本文关键字:模型 表达式 ViewData | 更新日期: 2023-09-27 18:00:25

我对ViewModel上的Edit视图有点问题。当我第一次将我的编辑视图发布到服务器上时,它需要再次返回带有数据库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);
  }
}

这里的相关部分是invoice.ID为0的地方,发票被保存到DB中以获得ID并返回到Edit视图。在这种观点下,我首先得到了以下几条线:

@model eu.ecmt.RecruitmentDatabase.ViewModels.InvoiceDetailsViewModel
@using (Html.BeginForm("Edit", "Invoice", FormMethod.Post, new { id = "invoices-edit-form" })) {
    @Html.ValidationSummary(true)
    <script type="text/javascript">
        $(document).ready(function () {
            //$("#tabs").tabs();
            InitProfileUI();
        });
    </script>
    if (Model.ID != 0) {
        <script type="text/javascript">
            $(document).ready(function () {
                LoadList('/InvoiceDetail/List/@Model.ID', '', 'invoice-details');
            });
        </script>
    }
    <fieldset>
        <legend>Edit contract</legend>
        @Html.HiddenFor(m => m.ID)
        @Html.HiddenFor(m => m.InvoiceNumber)
        @Html.HiddenFor(m => m.Created)
        @Html.HiddenFor(m => m.CreatedBy)
        @Html.HiddenFor(m => m.Modified)
        @Html.HiddenFor(m => m.ModifiedBy)

首次呈现此视图时,包含LoadList调用的脚本元素不在输出中。当发布表单并使用更新的视图模型呈现视图时,该元素就在输出中。但是,包含发票ID的隐藏字段仍然显示0。因此,本质上,这里发生的事情是,ViewData字典中的Model对象是正确的版本,表达式中使用的对象似乎是另一个旧版本。

有人愿意解释这一点并为我指明正确的方向吗?

表达式中的模型与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);
  }
}