【问题标题】:MVC5 view showing incorrect ID after cloning entity and returning with new ID [duplicate]MVC5 视图在克隆实体并返回新 ID 后显示不正确的 ID [重复]
【发布时间】: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


【解决方案1】:

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

ASP.Net MVC Html.HiddenFor with wrong value

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

modelState.Remove("ID");

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

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2010-09-29
    • 2021-11-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多