簡體   English   中英

模型值未從主視圖帶入局部視圖-C#MVC

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

我已經難過幾天了。

我有一個包含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。 (逐步執行) 在此處輸入圖片說明

下面是索引視圖時的模型 在此處輸入圖片說明

同樣,在_Data.cshtml部分視圖中 在此處輸入圖片說明

現在,在控制器的“數據”操作中有一個斷點,該布爾值現在為false 在此處輸入圖片說明

即使在Data操作中的第一行代碼之前,布爾值也沒有真實值。

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

我認為問題是您沒有在控制器的Data方法中正確填充視圖模型。

在這兩種方法中,您都將NGT_VM屬性發送到視圖,但僅填充Index方法中的某些數據-調用Data方法時,默認情況下不會保留或創建此Data

每次請求命中某個控制器方法時,都會重新創建該控制器,並且僅調用構造函數和請求的方法。 在創建對控制器的Data請求的情況下, NGT_VM屬性設置回默認的NGTransCertViewModel對象,並使用默認的NGTransCertServicesModel對象(布爾屬性filter_NJDVSVR24將默認設置為false )。 然后,您創建並忽略了變量List_certServices ,但是您NGTransServicesModel沒有更新視圖模型上的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 ,但是我不確定這是否是您要NGTransServicesModel的行為?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM