Я был в тупике в течение нескольких дней.
У меня есть индексная страница, которая содержит частичное представление. Модель представления передается на страницу индекса от своего контроллера, затем передается изнутри index.cshtml в представление renderpartial в качестве расширения. Представление renderpartial автоматически обновляется каждые 10 секунд (с помощью функции jquery для контроллера со страницы индекса), чтобы обновить его содержимое, которое работает нормально. Страница индекса содержит несколько флажков, которые отфильтровывают содержимое представления renderpartial. Проблема возникает, когда первоначальное представление renderpartial вызывается по истечении периода времени, контроллер для представления renderpartial не имеет правильных данных модели, которые ранее имел контроллер для индекса. Булевы значения в модели, которые были установлены в true, когда в контроллере индекса теперь ложно, когда мы попадаем в представление renderpartial. Давайте начнем ...
Просмотр моего индекса:
@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 на страницу index и передаю ту же модель в renderpartial. Все довольны, пока не истечет тайм-аут 10 секунд и не будет обработан _Data.cshtml. Значения флажка теперь все ложные.
Позвольте мне добавить визуальный элемент. Ниже приведена модель при возврате из контроллера в индексное представление с логическим значением true, если это необходимо. (шагая через)
Ниже приведена модель при индексном представлении
Опять же в частичном представлении _Data.cshtml
Теперь с точкой останова в действии Data в контроллере это то же самое значение bool теперь false
Значение bool не имеет истинного значения даже до первой строки кода в действии Data.
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();