ASP MVC视图在无效时不显示更新的数据

时间:2013-06-11 18:26:42

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor

在我的ASP MVC 3网站中,当用户从Sole Proprietor下拉框中选择Producer Type的值时,字段集中名称为DSS Specific的所有值都将是重新呈现视图时无效并且不再显示。

当单步执行代码时,我可以看到在用户点击save后,模型对象正确评估Producer Type,将相应的字段设置为null,当视图为正在呈现我可以看到Model对象中的字段实际上是null所需的字段。

但是,视图仍会显示在命中save之前字段中的值,并且尽管传递了对象,但仍然显示这些字段的null值。我还打了十几次刷新,以确保页面不是简单地在浏览器中缓存。

CONTROLLER

当模型对象首次传递回控制器时,它将通过名为ReformatFields

的方法运行
    [HttpPost]
    public ActionResult Edit(Monet.Models.AgentTransmission agenttransmission)
    {
        //redirect if security is not met.  
        if (!Security.IsModifier(User)) return RedirectToAction("Message", "Home", new { id = 1 });

        //Tax Id security
        ViewBag.FullSSN = Security.IsFullSsn(User);

        try
        {
            agenttransmission = AgentTransmissionValidator.ReformatFields(agenttransmission);

这是ReformatFields中的代码,用于确定是否取消特定字段。然后将模型对象分配回控制器上方的agenttransmission对象。

        //TODO:  blank out DSS specific fields if not a sole proprietor!
        if (!agt.ProducerType.Equals("S") || !agt.DRMrole.Equals("Sole Proprietor"))
        {
            agt.C8CharAgentCAB0State = null;
            agt.C8CharAgentCAB0MktDiv = null;
            agt.CONCode = null;
            agt.BundleCode = null;
            agt.LifeRegion = null;
            agt.LifeField = null;
            agt.AGYMGMT = null;
            agt.INDSGC = null;
            agt.PENSGC = null;
            agt.GRPSGC = null;
            agt.LMKSGC = null;
            agt.LDT = null;
            agt.GCASBNS = null;
            agt.GCOMMSN = null;
            agt.GPROFBN = null;
            agt.INDSplits = null;
            agt.DSTSGC = null;
            agt.ANNCommCode = null;
            agt.LifeEAPercent = null;
            agt.VARPercent = null;
            agt.OwnerMaster = null;
            agt.LifeMaster = null;
            agt.CampaignMaster = null;
            agt.RelationshipEffDate = null;
            agt.RelationshipDistCode = null;
        }
        return agt;
    }

保存后,agenttransmission模型对象将被发送回视图

                db.SaveChanges();
                DisplayPrep();
                agenttransmission.displayChannel = getDisplayChannel(agenttransmission);
                agenttransmission.FormattedReferenceNumber =
                    ReferenceConversion.UnobAndFormat(agenttransmission.ReferenceNumber, "S");
                return View(agenttransmission);
            }

查看

从下面的屏幕截图中可以看到,传递回视图的Model对象的nullCONCode的值为BundleCode

enter image description here

但是,页面呈现的值与以前相同。

enter image description here

这不是页面缓存值的问题,因为您可以在此处看到HTML实际上是使用这些值进行渲染

enter image description here

以下是这两个字段视图中的实际代码

    <div class="M-editor-label">
        @Html.LabelFor(model => model.CONCode)
    </div>
    <div class="M-editor-field">
        @Html.TextBoxFor(model => model.CONCode, new { maxlength = 2 })
        @Html.ValidationMessageFor(model => model.CONCode)
    </div>

    <div class="M-editor-label">
        @Html.LabelFor(model => model.BundleCode)
    </div>
    <div class="M-editor-field">
        @Html.TextBoxFor(model => model.BundleCode, new { maxlength = 6 })
    </div>

我意识到这是一个涉及的过程,所以如果我错过任何你认为有用的东西,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:3)

当您执行POST时,所有数据都存储在ModelState中。将模型中的属性设置为null然后在视图中返回该模型不会在视图中将它们清空,因为它们仍在ModelState中。您可以重定向到GET操作并以其他方式保留此数据或清除ModelState:

ModelState.Clear();

@Html.TextBoxFor之类的Html帮助程序正在从ModelState中提取数据,而不是直接从模型类中提取数据,这就是为什么即使将它们设置为null,值仍然会出现。