我被难住了好几天。
我有一个包含渲染部分视图的索引页面。视图模型从其控制器传递到索引页面,然后从 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 操作中有一个断点,同样的 bool 值现在是 false
即使在 Data 操作中的第一行代码之前,布尔值也没有真正的值。
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();