【问题标题】:Partial View displays wrong data after update (asp.net MVC5)部分视图更新后显示错误数据(asp.net MVC5)
【发布时间】:2019-01-30 20:44:17
【问题描述】:

这里有一些类似的问题我已经检查过,但似乎没有一个能回答我的问题,所以希望有人能帮助我。

我在视图中有一个表单,我正在使用一个像子表单一样的局部视图。部分视图用于显示项目的 iList。 (下面的屏幕截图显示了它的显示方式)。

在局部视图中,每个项目都有一个复选框,用户可以选中它来删除它。如果我选中第一项的复选框,则第一项会从代码列表中删除,但是当模型传回视图时,错误的项(选中的项)是返回的项。

因此,在下面的示例中,如果我检查第一个项目(无应答延迟 = 18)并提交,相同的项目将保留在页面上,而另一个(无应答延迟 = 10)则消失。如果我然后重新加载所有数据,则会出现正确的项目(无应答延迟 = 10)。

我已经检查了正确的数据被传回的方法,但错误的项目仍然保留在页面上。如果我然后刷新页面,则会出现正确的项目。请注意,该方法已经过一些清理,但正确的项目确实会从数据库中删除。

另外需要注意的是,这是一个第三方产品的插件,所以除非我发布到其他产品,否则我无法运行它,这使得调试变得很棘手。

主视图的代码是

@using(Html.BeginForm("SaveCallFeatures", "CallFeatures", FormMethod.Post, new { id = "CallFeatures", name = "CallFeatures" }))
{
    @Html.AntiForgeryToken()

    <div>
        <h2>Call Features</h2>

        <div class="form-panel">
            <h4>Telephone Call Features</h4>

            <div>
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                @Html.LabelFor(model => model.phoneNumber, htmlAttributes: new { @class = "label" })
                @Html.EditorFor(model => model.phoneNumber, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.phoneNumber, "", new { @class = "text-danger" })
            </div>

            <div>
                @Html.LabelFor(model => model.password, htmlAttributes: new { @class = "label" })
                @Html.EditorFor(model => model.password, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.password, "", new { @class = "text-danger" })
            </div>

            <div>
                @Html.LabelFor(model => model.hideOutgoingCallerID, htmlAttributes: new { @class = "label" })
                @Html.CheckBoxFor(model => model.hideOutgoingCallerID, new { htmlAttributes = new { @class = "form-control" } })
            </div>

            <div>
                @Html.LabelFor(model => model.callWaiting, htmlAttributes: new { @class = "label" })
                @Html.CheckBoxFor(model => model.callWaiting, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

        <div id="ForwardRules">
            @Html.Partial("_ForwardingRules")
        </div>

    </div> //form

    @Html.TextArea("Test")

    <div id="form-buttons" class="col-md-offset-4 col-md-6">
        <input type="button" value="Save" id="save-button" class="btn btn-primary" />
    </div>


<script type="text/javascript">
    $("#update-button").on('click', function () {
        GetFwdRules();
    });
</script>




function GetFwdRules() {
        $.ajax
        ({
            url: '@Url.Action("GetFwdRules", "CallFeatures", new { boid = Model.CompanyId })',
            method: 'GET',
            data: $("#CallFeatures").serialize(),
            cache: false,
            success: function (returnData) {
                $("#ForwardRules").html(returnData);
                $("#Test").html(returnData);
                alert('GetFwdRules');
            },
            failure: function () {
                alert('GetFwdRules Failure');
            }
        });
    }

部分视图的代码

@model XXXXX.Models.CallFeaturesModel

<div class="form-panel">
<h4>Active Forwarding Rules</h4>

    @for(int i = 0; i < Model.FwdRules.Count; i++)
    {
        <div>
            @Html.HiddenFor(model => Model.FwdRules[i].ForwardingRuleID)
        </div>
        <div>
            @Html.LabelFor(model => Model.FwdRules[i].Condition)
            @Html.TextBoxFor(model => Model.FwdRules[i].Condition, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
        </div>
        <div>
            @Html.LabelFor(model => Model.FwdRules[i].Destination)
            @Html.TextBoxFor(model => Model.FwdRules[i].Destination, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
        </div>
        <div>
            @Html.LabelFor(model => Model.FwdRules[i].NoAnswerDelay)
            @Html.TextBoxFor(model => Model.FwdRules[i].NoAnswerDelay)
            @Html.DescriptionFor(model => model.FwdRules[i].NoAnswerDelay)
        </div>
        <div>
            @Html.LabelFor(model => Model.FwdRules[i].ToDelete)
            @Html.CheckBoxFor(model => Model.FwdRules[i].ToDelete)
        </div>
        <br />
    }

这是方法

[HttpGet]
public ActionResult GetFwdRules(CallFeaturesModel CFModel)
{
  // Refresh the list to include on those where the ToDelete variable == false (checkbox is unchecked)
  CFModel.FwdRules = CFModel.FwdRules.Where(x => x.ToDelete == false).ToList();
  return PartialView("_ForwardingRules", CFModel);
}   

这就是模型

 public class CallFeaturesModel : UIPluginBaseModel
 {
   [Display(Name = "Phone Number")]
   public string phoneNumber { get; set; }

   [Display(Name = "Password")]
   public string password { get; set; }

   [Display(Name = "Hide Outgoing Caller ID")]
   public bool hideOutgoingCallerID { get; set; }

   [Display(Name = "Call Waiting")]
   public bool callWaiting { get; set; }

   [Display(Name = "Message")]
   public string Message { get; set; }

   public IList<ActiveForwardRule> FwdRules { get; set; }
 }

public class ActiveForwardRule
{
  [Display(Name = "Rule ID")]
   public string ForwardingRuleID { get; set; }

   [Display(Name = "Condition")]
   public string Condition { get; set; }

   [Display(Name = "Destination")]
   public string Destination { get; set; }

   [Display(Name = "No Answer Delay", Description = " seconds (approx. 6 seconds for each ring cycle)")]
   public int NoAnswerDelay { get; set; }

   [Display(Name = "Delete")]
   public bool ToDelete { get; set; }
 }

这是示例的屏幕截图。看来我还不能嵌入图片。

希望有人能指出我哪里出错了。

【问题讨论】:

  • 可以分享一下用于提交的Controller方法吗?您共享的控制器方法看起来只是在按下“更新按钮”时刷新列表,您没有将其描述为流程的一部分。
  • 如果您在使用某些内容作为帖子的结果时得到奇怪的结果,我也会使用 ModelState.Clear() 来查看正在显示的是否是旧数据。它可能会帮助您找到问题
  • 嗨@Hopeless,我所包含的方法(基本上创建了一种处理按钮单击的方法-无论如何我都是这样做的)是我在那里使用的方法的净化版本是我无法分享的原版中一些与工作相关的内容。
  • 感谢@Slicksim,我尝试在返回 PartialView 之前添加它,但没有效果。
  • @Slicksim,忘记我的最后评论,这解决了它,太棒了,谢谢。如果您可以将此添加为解决方案,我可以接受。

标签: asp.net-mvc-5


【解决方案1】:

当在同一个请求中发布数据然后重新显示数据时,ModelState 将填充来自原始帖子的数据。

这可能会导致本应删除的项目仍然显示或预填写的表单现在应该为空白。

添加:

ModelState.Clear()

在重新显示数据之前,将清除模型状态并防止标签助手从原始发布请求中填充自己

【讨论】:

  • 调试这个感觉就像一个发烧的梦。感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-08-05
  • 2019-05-17
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多