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

Model values not carrying into partial view from main view- C# MVC

我被难住了好几天了。

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

局部视图_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 之前,一切都很顺利。复选框值现在全部为 false。

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

下面是索引视图时的模型

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

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

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

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

我认为问题在于您没有在控制器的 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);
}

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