我已经难过几天了。
我有一个包含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操作中带有断点,现在相同的bool值为false
即使在Data操作的第一行代码之前,布尔值也没有真实值。
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
答案 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
,但是我不确定这是否是您要遵循的行为?