MVC5 视图在克隆实体后显示不正确的 ID,并使用新 ID 返回



我正在使用下面的代码创建一个新实体并为其提供新ID。这一直工作正常,直到(并且似乎已经过去了)视点渲染。如果我单步执行代码,则新实体具有新 ID,保存到数据库中,并与 ActionResult 一起返回。当我逐步完成视图呈现过程时,Model.ID 属性包含新 ID。渲染完成后,如果我检查页面元素,ID 字段包含旧的实体 ID。

public ActionResult Modify(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
MyEntity entity = db.MyEntities.AsNoTracking().Where(e => e.ID == id).FirstOrDefault();
if (entity == null)
{
return HttpNotFound();
}
entity.ID = System.Guid.NewGuid();
entity.ParentID = id;
db.MyEntities.Add(entity);
db.SaveChanges();
var _entityDto = Mapper.Map<MyEntity, MyEntityDto>(entity);
return View(_entityDto);
}

如果有人想知道我为什么要这样做,这样我就可以对需要批准的现有实体进行更改(批准过程将用修改后的实体替换原始实体)。

以前有人发生过这种情况吗?关于可能导致它的原因和/或我如何解决它的任何想法?

编辑:有趣的是......如果我更改实体中的任何值,例如文本字段或日期,这些新值将显示在编辑器视图中,但ID保持不变。如果我保存,原始实体会用新值进行修改。如果我取消,新实体存在,我可以正常编辑它。在同一操作中克隆并返回克隆实体的视图时,似乎会出现此问题。

@model MyProject.ViewModels.MyEntityDto
<div id="modal-content" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
@{
using (Ajax.BeginForm("Edit", "MyEntities", null,
new AjaxOptions
{
HttpMethod = "POST",
OnBegin = "onBegin(xhr,'MyEntities')",
OnSuccess = "onSuccess(data,status,xhr,'MyEntities',successCallback)",
OnFailure = "onFailure(xhr,status,error,'MyEntities',failureCallback)",
OnComplete = "onComplete(xhr,status,'MyEntities')",
},
new { @id = "modalForm" }))
{
@Html.AntiForgeryToken()
<div style="text-align:center;">
<h4>Edit Entity</h4>
</div>
<div id="modal-body" class="modal-body">
<div class="form-horizontal">
@Html.HiddenFor(model => Model.ID)
<div id="wizard">
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active">
<a href="#tab1-Entity" role="tab" data-toggle="tab">Entity</a>
</li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="tab1-Entity">
<div class="form-group">
@Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-8">
@Html.EditorFor(model => model.Description, new
{
htmlAttributes = new
{
@class = "form-control",
@title = ModelMetadata.FromLambdaExpression(model => model.Description, ViewData).Description
}
})
@Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Notes, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-8">
@Html.EditorFor(model => model.Notes, new
{
htmlAttributes = new
{
@class = "form-control",
@title = ModelMetadata.FromLambdaExpression(model => model.Notes, ViewData).Description
}
})
@Html.ValidationMessageFor(model => model.Notes, "", new { @class = "text-danger" })
</div>
</div>
</div>
</div>
</div>
</div>                    
</div>
<div id="modal-footer" class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
<input type="submit" value="Save" class="btn btn-default" />
</div>
}
}
</div>
</div>
</div>

为 @Html.HiddenFor(model => model.ID) 生成的标记

<input name="ID" id="ID" type="hidden" value="574a146b-1198-4e07-a199-701d9f8306aa" data-val="true" data-val-required="The ID field is required.">

为@html生成标记。显示对象(型号 => model.ID)

d192454f-e35f-41ef-b781-5a5caf84b603

我想这完全取决于你如何提出问题。我做了一个更具体的谷歌搜索,并提出了以下帖子:

ASP.Net MVC Html.HiddenFor 具有错误值

该帖子建议的以下更改起到了作用-我添加了...

modelState.Remove("ID");

。到我的 Modify() 控制器操作,它解决了问题。

最新更新