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

时间:2019-06-19 14:22:24

标签: c# asp.net-mvc model-view-controller model html.renderpartial

我已经难过几天了。

我有一个包含renderpartial视图的索引页。一个视图模型从其控制器传递到索引页面,然后从index.cshtml内部传递给扩展部分视图。 renderpartial视图每10秒自动更新一次(通过jquery函数从索引页到控制器)以更新其内容,效果很好。索引页面包含多个复选框,用于过滤renderpartial视图的内容。当在经过一段时间后调用初始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>

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>

我的ViewModel:

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页面时,我运行InitServiceTypeCheckBoxes方法,该方法将复选框的值设置为true,将viewmodel传递给索引页面,并将该模型传递给renderpartial。所有人都感到高兴,直到达到10秒超时并呈现_Data.cshtml。复选框值现在全部为false。

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

下面是索引视图时的模型 enter image description here

同样,在_Data.cshtml部分视图中 enter image description here

现在控制器中的Data操作中带有断点,现在相同的bool值为false enter image description here

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

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

1 个答案:

答案 0 :(得分: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,但是我不确定这是否是您要遵循的行为?