Значения модели, не входящие в частичный вид из основного вида - C # MVC - PullRequest
0 голосов
/ 19 июня 2019

Я был в тупике в течение нескольких дней.

У меня есть индексная страница, которая содержит частичное представление. Модель представления передается на страницу индекса от своего контроллера, затем передается изнутри 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, если это необходимо. (шагая через) enter image description here

Ниже приведена модель при индексном представлении enter image description here

Опять же в частичном представлении _Data.cshtml enter image description here

Теперь с точкой останова в действии Data в контроллере это то же самое значение bool теперь false enter image description here

Значение bool не имеет истинного значения даже до первой строки кода в действии Data.

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

1 Ответ

1 голос
/ 19 июня 2019

Я думаю, проблема в том, что вы неправильно заполняете модель представления в методе Data вашего контроллера.

В обоих методах вы отправляете свойство NGT_VM в представление, но заполняете только некоторые данные в методе Index - эти данные не будут сохраняться или создаваться по умолчанию при вызове Data метод.

Каждый раз, когда запрос попадает в метод контроллера, этот контроллер создается заново, и вызываются только конструктор и запрошенный метод. В случае запроса к Data создан контроллер, свойство NGT_VM возвращается к объекту NGTransCertViewModel по умолчанию, с объектом NGTransCertServicesModel по умолчанию (логическое свойство filter_NJDVSVR24 будет по умолчанию * 1014) *). Затем вы создаете и игнорируете переменную 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, но я не уверен, что вы действительно придерживаетесь такого поведения?

...