【发布时间】:2018-08-25 21:26:13
【问题描述】:
我正在使用下面的代码创建一个新实体并为其指定一个新 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.DisplayFor(model => model.ID) 生成标记
d192454f-e35f-41ef-b781-5a5caf84b603
【问题讨论】:
-
你能发布为有问题的元素和原始元素生成的 HTML 标记吗?
-
@AlwaysLearning :添加标记 - 见上文
-
如果我添加 @Html.DisplayFor(model => model.ID) 会显示正确的 ID,但 @Html.HiddenFor(model => model.ID) 在标记中显示不正确的 ID..见编辑
-
你能分享一下你的地图方法吗
-
Map 方法只是默认的 AutoMapper 映射。两者之间没有特殊的转换。我在另一篇文章中找到了答案。见下文..
标签: c# asp.net-mvc-5 entity-framework-6 clone