首页 > 解决方案 > MVC- 检索 EditorFor 的原始值

问题描述

在我网站的编辑页面上,我希望用户能够编辑数量,然后让它改变模型。这就是我使用“editorFor”的原因。问题是我仍然想在模型被编辑到控制器 post 方法之前返回它的值。

例如,如果用户将数量从 7 编辑到 10,我希望模型更改为 10,但我也希望视图将 7 返回给控制器。我怎样才能做到这一点?

这是我的编辑器代码

  <div class="form-group">
            @Html.LabelFor(model => model.item_qty, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.item_qty, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.item_qty, "", new { @class = "text-danger" })
            </div>
  </div>

这是我的编辑帖子方法

[RestrictAccess(restriction = AccessRestrictions.ModifyWorkOrder)]
        [HttpPost]
        [ValidateAntiForgeryToken]
        [Audit]
        public ActionResult Edit([Bind(Include = "ID,JobOrderID,StartDate,CompleteDate,jobSection,ItemID,item_qty,actual_item_qty,ComponentID,comp_qty,actual_comp_qty,PartID,part_qty,actual_part_qty,Notes,subDetail")] JODetails jODetails)
        {
            if (ModelState.IsValid)
            {
                JobOrder jo = db.JobOrders.Find(jODetails.JobOrderID);

                    db.Entry(jODetails).State = EntityState.Modified;


                    JODetails currentData = db.JODetails.Find(jODetails.ID);
                    Component comp = db.Components.Find(jODetails.ComponentID);
                    Item i = db.Items.Find(jODetails.ItemID);

                    int newItemCount = jODetails.item_qty != null ? (int)jODetails.item_qty : 0;                 
                    int oldItemCount = 0;
                    int itemDiff = newItemCount - oldItemCount;

           }

标签: c#htmlasp.net-mvclinqrazor

解决方案


如果我理解得足够好,您就不需要从视图中返回值。当model传递给控制器​​时,数据库中的值没有改变,您可以再次读取它。像这样的东西:


// First. Grab the previous quantity...
// This approach won't work because of EF is already TRACKING the entity
// JODetails currentData = db.JODetails.Find(jODetails.ID);
// So, you have to access data like this...
var currentData = db.JODetails.AsNoTracking().FirstOrDefault(j => j.ID == jODetails.ID);

int previousQuantity = currentData?.item_qty;

//... do whatever with previousQuantity prop & new JODetails model. Don't forget to check if currentData is null 

// Just NOW. Mutate the object via EF...
db.Entry(jODetails).State = EntityState.Modified;

// THEN. Commit changes...
db.SaveChanges();

直到你SaveChanges()数据库中的记录才真正改变。阅读一些关于 EF 如何跟踪、修改和保存对象的文档。

这可能对理解这一点非常有帮助......

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/introduction/examinening-the-edit-methods-and-edit-view

当然,如果您需要从视图中检索 Quantity 数据(不明白为什么),还有一些替代方法,例如 aViewModel但我认为这可以解决问题。是的,使用这种方法可以再访问一次数据库,但很少。


推荐阅读