模型值未从主视图带入局部视图-C#MVC

模型值未从主视图带入局部视图-C#MVC,c#,asp.net-mvc,model-view-controller,model,html.renderpartial,C#,Asp.net Mvc,Model View Controller,Model,Html.renderpartial,我已经被难倒好几天了 我有一个包含renderpartial视图的索引页。viewmodel从其控制器传递到索引页,然后作为扩展从index.cshtml内部传递到renderpartial视图。renderpartial视图每10秒自动更新一次(通过jquery函数从索引页向控制器发送),以更新其内容,这很好。索引页面包含多个复选框,用于过滤renderpartial视图的内容。如果在时间段已过时调用初始renderpartial视图,则会出现问题,renderpartial视图的控制器没有索

我已经被难倒好几天了

我有一个包含renderpartial视图的索引页。viewmodel从其控制器传递到索引页,然后作为扩展从index.cshtml内部传递到renderpartial视图。renderpartial视图每10秒自动更新一次(通过jquery函数从索引页向控制器发送),以更新其内容,这很好。索引页面包含多个复选框,用于过滤renderpartial视图的内容。如果在时间段已过时调用初始renderpartial视图,则会出现问题,renderpartial视图的控制器没有索引控制器之前拥有的正确模型数据。当我们进入renderpartial视图时,模型中的布尔值在index controller中设置为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>
现在,当调用Index.cshtml页面时,我运行initServiceTypeCheckBox方法,将复选框值设置为true,将viewmodel传递给Index页面,并将相同的模型传递给renderpartial。在达到10秒超时并呈现_Data.cshtml之前,所有人都很高兴。复选框值现在全部为false

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

下面是当索引视图

同样,在_Data.cshtml部分视图中

现在控制器中的数据操作中有一个断点,该bool值现在为false

即使在数据操作的第一行代码之前,bool也没有真值

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

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

在这两种方法中,您都将
NGT_VM
属性发送到视图,但您仅填充
Index
方法中的一些数据-在调用
data
方法时,默认情况下不会保存或创建这些数据

每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。在请求创建控制器时,
NGT\u VM
属性被设置回默认的
NGTransCertViewModel
对象,带有默认的
NGTransCertServicesModel
对象(布尔属性
filter\u NJDVSVR24
将默认为
false
)。然后创建并忽略变量
List\u 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);
}
[OutputCache(NoStore=true,
Location=System.Web.UI.OutputCacheLocation.Client,
持续时间=10)]
公共行动结果数据()
{
NGTransCertDBHandle certDBHandle=新的NGTransCertDBHandle();
List_certServices=certDBHandle.GetService();
NGT_VM.NGTransServicesList=列表服务;
返回PartialView(“_数据”,NGT_虚拟机);
}

您可以调用相同的方法来更新
NGTransServicesModel
方法中所需的
Data
方法,但我不确定您在传递
列表的
Data
操作中所追求的行为是什么?

,但部分视图预期
selfservice\u Test2.Models.NGTransCertViewModel
。这应该会导致一个异常。不相关,但除非您必须支持IE6-8,否则您应该尝试使用比1.12更现代的JQuery版本。谢谢,我确实需要使用更新的JQuery版本。我添加了一些视觉效果以帮助充实我的问题。我添加了一些对问题的视觉支持。在执行数据操作中的第一行代码之前,该值丢失。@JasonBeck如果在使用
Data
方法时拍摄了最后一张照片,这是预期的-您仅在
Index
方法中填充
NGTransServicesModel
。控制器中的属性在请求之间不会持久,这意味着您需要在每个方法中重新创建模型(或者在任何方法之前调用的构造函数中重新创建模型)。感谢您的输入。出于某种原因,我认为它会一直存在,因为“certServicesModel”在方法之外,但它显然不起作用。对于网站目前的工作方式,我认为娱乐是一个建设者是最好的选择,谢谢你的洞察力!没问题,很高兴能帮上忙:)
 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; }
    ...
}
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
[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);
}