【问题标题】:Why does my update model operation cause duplicates in ASP.NET Core?为什么我的更新模型操作会在 ASP.NET Core 中导致重复?
【发布时间】:2021-10-16 20:05:35
【问题描述】:

我尝试了不同的方法,但每次更新都会复制我的模型。

我通过 HTTP POST 操作将我的视图中的人员对象传递给控制器​​方法,然后调用 .Update(...) 方法。

我的看法是:

@model Falcon.Models.Person

<h2>User @Model.FullName</h2>
<div>
    <form method="post" class=container>
    <section>
        <h4>General information</h4>
    
    <div class=row>
    <div class=col-25><label asp-for=Surname></label></div>
    <div class=col-75><input asp-for=Surname type="text"/></div>
    </div>  
     <div class=row>
    <div class=col-25><label asp-for=Name></label></div>
    <div class=col-75><input asp-for=Name type="text"/></div>
    </div>  
     ......
    <div class=row> 
        <div class=col-25><label asp-for=Email></label> </div>
        <div class=col-75><input asp-for=Email type="email" /></div>
    </div>         
</section>

<input type="submit" value="Submit changes" asp-action="Edit" asp-controller="Person"/>     
</form>

PersonController的操作是:

 [HttpPost]
    public async Task<IActionResult> Edit (Person person)
    {
        db.Persons.Update(person);
        await db.SaveChangesAsync();           
        return RedirectToAction("Index");
    }

为什么每次更新操作都会复制我的对象?

【问题讨论】:

    标签: c# asp.net-core entity-framework-core asp.net-core-mvc


    【解决方案1】:

    您正在映射一个 Person 模型 (@model Falcon.Models.Person),该模型将由主键确定唯一性 - 比如说 Person.Id

    由于您没有将 UI 中的 something 绑定到您的 ID,因此 ASP.NET 每次都会生成一个 ID,这意味着它会被识别为一个新人每次“更新”。

    将其设为隐藏字段,以便 ASP.NET 可以传递现有的 Id 值,并知道它是更新操作而非创建。

    <input type="hidden" asp-for="Id" />
    

    【讨论】:

      【解决方案2】:

      您必须为主键添加隐藏字段 - Person.Id。没有这个实体框架可以判断它是一个新对象

      <input type="hidden" asp-for="Id" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-16
        • 2019-11-15
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多