C# 每次表单提交MVC 4 C时创建的重复记录#

C# 每次表单提交MVC 4 C时创建的重复记录#,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,在MVC4和实体框架上工作,在svind新记录后面临一个棘手的问题,我已将Id传递给视图模型,但它保持不变;(: 公共操作结果编辑(SubscriptionViewModel oSubModel){ if(ModelState.IsValid){ 订阅oSubDetail=新订阅(); oSubDetail.Title=oSubModel.Title; oSubDetail=this.subRep.SaveSubscription(oSubDetail); if(oSubDetail==null

在MVC4和实体框架上工作,在svind新记录后面临一个棘手的问题,我已将Id传递给视图模型,但它保持不变;(:

公共操作结果编辑(SubscriptionViewModel oSubModel){ if(ModelState.IsValid){ 订阅oSubDetail=新订阅(); oSubDetail.Title=oSubModel.Title; oSubDetail=this.subRep.SaveSubscription(oSubDetail); if(oSubDetail==null){ AddModelError(“错误”,“保存数据时出错,请稍后再试。”); }否则{ oSubModel.Id=oSubDetail.Id;//Id返回视图 AddModelError(“成功”,“用户已保存”); } } } 返回视图(oSubModel);//模型返回视图 //注意:我通过此处显示的id正确,但在视图中仍然为0 } @使用(Html.BeginForm()){ @Html.ValidationSummary(true,“,new{@class=“text danger”}) @Html.HiddenFor(model=>model.Id) @LabelFor(model=>model.Title,htmlAttributes:new{@class=“control label”}) @EditorFor(model=>model.Title,new{htmlAttributes=new{@class=“form control”}) @Html.ValidationMessageFor(model=>model.Title,“,new{@class=“text danger”}) }
注意:在我传递的控制器id中,显示正确,但在视图中,id仍然为0,因为MVC在
ModelState
中查找最初提供给视图的值。为了防止出现这种情况,您需要删除
ModelState
中的值:

oSubModel.Id = oSubDetail.Id; //Id return to view
ModelState.Remove("Id");
现在问题解决了,当您第一次保存记录时,您将返回ID。但是,当您再次提交时,您没有使用ID,因此它将创建另一条记录。假设您的
SaveSubscription
功能检测到ID的存在并更新记录,而不是插入新的记录,则需要向其传递ID:

Subscription oSubDetail = new Subscription();
oSubDetail.Title = oSubModel.Title;
oSubDetail.Id = oSubModel.Id;
oSubDetail = this.subRep.SaveSubscription(oSubDetail);

ID没有更改,因为MVC在
ModelState
中查找最初提供给视图的值。为了防止出现这种情况,您需要删除
ModelState
中的值:

oSubModel.Id = oSubDetail.Id; //Id return to view
ModelState.Remove("Id");
现在问题解决了,当您第一次保存记录时,您将返回ID。但是,当您再次提交时,您没有使用ID,因此它将创建另一条记录。假设您的
SaveSubscription
功能检测到ID的存在并更新记录,而不是插入新的记录,则需要向其传递ID:

Subscription oSubDetail = new Subscription();
oSubDetail.Title = oSubModel.Title;
oSubDetail.Id = oSubModel.Id;
oSubDetail = this.subRep.SaveSubscription(oSubDetail);

这是因为
HtmlHelper
方法使用
ModelState
中的值(如果它们存在的话)(在您的情况下它们会这样做)。中解释了该行为。但保存数据后不应返回视图。您应该重定向(PRG模式)这是因为
HtmlHelper
方法使用
ModelState
中的值(如果它们存在的话)(在您的情况下它们会这样做)。中解释了该行为。但保存数据后不应返回视图。您应该重定向(PRG模式)