使用新添加的数据库ID填充视图模型

时间:2012-07-20 09:20:44

标签: asp.net asp.net-mvc asp.net-mvc-3 entity-framework

这是对昨天提出的问题的跟进。

我有一个viewmodel,它显示了一系列目标。使用jquery我可以在屏幕上添加一个新的目标行(对于列出的任何新目标,ID设置为0)。当我单击“保存”按钮将目标列表发回控制器时,控制器将遍历目标列表,并根据数据库检查ID。如果未找到ID,则会创建新目标,将其添加到数据库上下文,并保存更改。然后它会检索ID,并将View(模型)返回到View。

问题是,尽管模型中的ID已更新为数据库ID - 当模型再次在View中呈现时,它的ID仍为0.因此,如果我再次单击“保存”,则再次添加再次将“之前添加的新目标”添加到数据库中。

我的控制器如下所示:

    //
    // POST: /Objective/Edit/model
    [HttpPost]
    public ActionResult Edit(ObjectivesEdit model)
    {
        if (model.Objectives != null)
        {
             foreach (var item in model.Objectives)
            {
                // find the database row
                Objective objective = db.objectives.Find(item.ID);
                if (objective != null) // if database row is found...
                {
                    objective.objective = item.objective;
                    objective.score = item.score;
                    objective.possscore = item.possscore;
                    objective.comments = item.comments;
                    db.SaveChanges();
                }
                else // database row not found, so create a new objective
                {
                    Objective obj = new Objective();
                    obj.comments=item.comments;
                    obj.objective = item.objective;
                    obj.possscore = item.possscore;
                    obj.score = item.score;
                    db.objectives.Add(obj);
                    db.SaveChanges();
                    // now get the newly created ID 
                    item.ID = obj.ID;
                 }
             }
        }
        return View(model);
    }

我的ID正在控制器中设置:

enter image description here

编辑:此处的另一个示例,显示模型。目标1。ID正在更新:

enter image description here

但是当视图呈现时,它会恢复为0:

enter image description here

目标列表确定如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcObjectives2.Models
    {
    public class ObjectivesEdit
    {
        public IEnumerable<Objective> Objectives { set; get; }
        public ObjectivesEdit()
        {
            if (Objectives == null)
                Objectives = new List<Objective>();
        }
    }
    }

视图有:

@model MvcObjectives2.Models.ObjectivesEdit

@using (Html.BeginForm())
{
  @Html.EditorFor(x=>x.Objectives)
  <button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> Save</button>
 }

并在我的EditorTemplate(objective.cshtml)中:

@model  MvcObjectives2.Models.Objective          

<div class="objec">
<div>
@Html.TextBoxFor(x => x.objective})
</div>
<div>
@Html.TextBoxFor(x => x.score})
</div>
<div>
@Html.TextBoxFor(x => x.possscore})
</div>
<div>
@Html.TextBoxFor(x => x.comments})

@Html.HiddenFor(x => x.ID)  // This is the ID where it should now show the new ID from the database, but shows 0

</div>
</div>

我怀疑问题出在我控制器的某个地方 - 但我很感激有关如何让我的视图呈现添加目标的新ID的任何建议。

2 个答案:

答案 0 :(得分:3)

在重新编写搜索后,我发现了几个帖子,说这是设计的。如果再次显示相同的页面,则发布表单期望显示发送给控制器的内容。

但是,你可以添加它,它将刷新ModelState,并且可以显示模型中更新的值,并在控制器中更新:

        ModelState.Clear();
        return View(model);

我不确定这是否还有其他效果 - 但就目前而言,似乎工作正常。

谢谢,Mark

答案 1 :(得分:0)

Html.HiddenFor在类似场景中曾经咬过我。问题是当使用这个Html帮助程序时,隐藏值不会在重新发布时更新。

如果您从表单发布内容并在控制器中更改它,当您使用它重新呈现页面时,将使用最初发布到操作的值。

改为使用

<input type="hidden" name="ID" id="ID" value="@Html.Encode(Model.ID)" />