0

我被难住了好几天。

我有一个包含渲染部分视图的索引页面。视图模型从其控制器传递到索引页面,然后从 index.cshtml 内部传递到渲染部分视图作为扩展。renderpartial 视图每 10 秒自动更新一次(通过 jquery 函数从索引页面到控制器)以更新其内容,效果很好。索引页面包含几个复选框,用于过滤掉渲染部分视图的内容。当时间段过去后调用初始渲染部分视图时会出现问题,渲染部分视图的控制器没有索引控制器先前具有的正确模型数据。当我们进入渲染部分视图时,模型中在索引控制器中设置为 true 的布尔值现在为 false。让我们开始...

我的索引视图:

@model SelfServe_Test2.Models.NGTransCertViewModel

...        

    <div class="Services_StatusTable" id="refreshme">        
    @{            
        Html.RenderPartial("_Data", Model);
    }            
    </div>

...

@Html.CheckBoxFor(m => m.NGTransServicesModel.filter_NJDVSVR24, new { onclick = "test(id)" }) @Html.Label("NJDVSVR24", new { })

...

<script src="~/Scripts/jquery-1.12.4.js"></script>
<script type="text/javascript">
    $(function () {
        setInterval(function () { $('#refreshme').load('/NGTransCertServices/Data'); }, 10000); // every 10 seconds

    function test(filter) {
        alert(filter);
        var serviceChecked = document.getElementById(filter).checked;
        $.ajax({
            type: "POST",
            url: "/NGTransCertServices/ToggleVisibleService",
            data: { 'filterOnService': filter, 'serviceChecked': serviceChecked, 'model': @Model },
            //success: function (result) {
            //    if (result === "True")
            //        alert("yup");
            //    else
            //        alert("nope");
            //}
        });
    }

</script>

PartialView _Data.cshtml:

@model SelfServe_Test2.Models.NGTransCertViewModel

...

<table>
foreach (var item in Model.NGTransServicesList)
{

    if (Model.NGTransServicesModel.filter_EBT == true)
    {
        if (item.Description.Contains("EBT"))
        {

        }
    }
}
</table>

我的视图模型:

namespace SelfServe_Test2.Models
{
public class NGTransCertViewModel
{
    public NGTransCertViewModel()
    {
        NGTransServicesModel = new NGTransCertServicesModel();
        NGTransServicesList = new List<NGTransCertServicesList>();
        NGTransServices = new NGTransCertServices();
    }
    public NGTransCertServicesModel NGTransServicesModel { get; set; }
    public List<NGTransCertServicesList> NGTransServicesList { get; set; }
    public NGTransCertServices NGTransServices { get; set; }
}
}

控制器:

 public class NGTransCertServicesController : Controller
{
    NGTransCertViewModel NGT_VM = new NGTransCertViewModel();
    NGTransCertServicesModel certServicesModel = new NGTransCertServicesModel();

    public ActionResult Index()
    {            
        NGTransCertServices certServices = new NGTransCertServices();                        
        NGT_VM.NGTransServicesModel = certServices.InitServiceTypeCheckBoxes(certServicesModel);   // sets all checkboxes to true initially.
        return View(NGT_VM);
    }


    [OutputCache(NoStore = true, Location = System.Web.UI.OutputCacheLocation.Client, Duration = 10)]    // in seconds
    public ActionResult Data()
    {
        NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
        List<NGTransCertServicesList> List_certServices = certDBHandle.GetService();
        return PartialView("_Data", NGT_VM);
    }
}

最后,丢失值的模型:

 public class NGTransCertServicesModel
{
    ...
    public bool filter_NJDVSVR24 { get; set; }
    ...
}

现在,当调用 Index.cshtml 页面时,我运行将复选框值设置为 true 的 InitServiceTypeCheckBoxes 方法,将视图模型传递给索引页面并将相同的模型传递给渲染部分。在达到 10 秒超时并呈现 _Data.cshtml 之前,一切都很愉快。复选框值现在全部为假。

让我添加一个视觉元素。下面是从控制器返回到索引视图时的模型,布尔值根据需要设置为 true。(通过) 在此处输入图像描述

下面是索引视图时的模型 在此处输入图像描述

同样,在 _Data.cshtml 部分视图中 在此处输入图像描述

现在在控制器的 Data 操作中有一个断点,同样的 bool 值现在是 false 在此处输入图像描述

即使在 Data 操作中的第一行代码之前,布尔值也没有真正的值。

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
4

1 回答 1

1

我认为问题在于您没有在Data控制器的方法中正确填充视图模型。

在这两种方法中,您都将NGT_VM属性发送到视图,但您只填充了方法中的一些数据Index- 默认情况下,当您调用该方法时,这些数据不会被持久化或创建Data

每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。Data在创建对控制器的请求的情况下,该NGT_VM属性被设置回默认NGTransCertViewModel对象,并带有一个默认NGTransCertServicesModel对象(布尔属性filter_NJDVSVR24将默认为false)。然后,您创建并忽略了一个变量List_certServices,但您从未更新NGTransServicesModel视图模型上的属性以匹配您从Index方法中获得的值。

您可能应该在填充NGTransServicesList变量NGT_VM.NGTransServicesList后将其分配给:

[OutputCache(NoStore = true, 
             Location = System.Web.UI.OutputCacheLocation.Client,
             Duration = 10)]
public ActionResult Data()
{
    NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
    List<NGTransCertServicesList> List_certServices = certDBHandle.GetService();
    NGT_VM.NGTransServicesList = List_certServices;
    return PartialView("_Data", NGT_VM);
}

您可以调用相同的方法来更新方法中的NGTransServicesModel要求Data,但我不确定这是否真的是您所追求的行为?

于 2019-06-19T14:47:03.987 回答