Модель передачи MVC между родительским и дочерним окном

Заранее спасибо. Пожалуйста, извините меня за мою грамматику. Я изо всех сил старался объяснить свою проблему. В своем стремлении решить приведенный ниже вопрос я сначала начал разрабатывать POC.

C# MVC Нет передачи объекта передачи между представлениями

У меня возникла проблема с использованием объекта TempData и передача моей модели между моим родительским всплывающим окном и дочерним всплывающим окном. Моя проблема в том, что я делаю TempData["StudentViewModel"] 2 раза. Вставка в первый раз и чтение в первый раз хороши, но чтение во второй раз, несмотря на то, что я уверен, что вставляю во второй раз перед чтением, не работает.

Я постараюсь объяснить это ясно.

У меня есть страница ASP.NET с именем Class.cshtml. У него будет сетка всех классов. Пользователь выберет столбец ClassName, и он откроет Student.cshtml в качестве нового всплывающего окна, в котором есть сетка со столбцами StudentName и Address. Пользователь выберет имя студента, и откроется другое всплывающее окно с именем StudentDetails.cshtml.

У нас есть ClassController.cs, который используется всеми всплывающими окнами и имеет методы C#. ClassController.js содержит весь код JavaScript.

public ActionResult GetStudentsDetails()
{
  // this will create students for each class. 
  //Inside student for each class it will also create Student Details.

   // First Insert
   TempData["StudentViewModel"] = studentViewModel;
   return View("Students", studentViewModel);    
}

Student.cshtml — это существующее всплывающее окно, как показано ниже.

<div>

//this is in for loop
string anchorElementId = string.Format("AnchorElementId_{0}", i);                                                      
string selectedIndex = i.ToString();
string name = Model.Students[i].Name;

 <input class="ButtonLikeHyperLink"
        id="myBtnId"
        onclick="ShowStudentDetails(@selectedIndex, '@name', '@anchorElementId')"
        value="@Model.Students[i].Name"
        type="button"/>


//for loop ends here

 //First read
<span id="lblHDNStudentViewModel">  
@Newtonsoft.Json.JsonConvert.SerializeObject(TempData["StudentViewModel"] as StudentViewModel)
</span>

</div>

Как только пользователь выбирает любое имя ученика во всплывающем окне Student.cshtml, вызывается приведенный ниже метод js, который открывает всплывающее окно дочернего окна с конкретными данными ученика.

Классконтроллер.js

function ShowStudentDetails(selectedIndex, name, anchorElementId)
{
    var inputParam = {};
    var hiddenField = document.getElementById("lblHDNStudentViewModel");
    if (hiddenField != null)
    {          
        inputParam.StudentVM = JSON.parse(hiddenField.innerText);

        inputParam.selectedIndex = selectedIndex;
        inputParam.name = name;
        inputParam.anchorElementId = anchorElementId;

        // __callback is our custom method to call controller action method
        var retVal = __callback("OnNameSelected", inputParam);
        var postedData = JSON.parse(retVal.return_value);
        if (postedData.Success == true)
        {
          // i need to do like below since Model to my popup is dynamic
         multipleMatchPopup = window.open('', '', properties);                       
         multipleMatchPopup.document.write(postedData.PartialViewHtml); 
        }
    }
}

Классконтроллер.cs

public JsonResult OnNameSelected(StudentViewModel StudentVM, int selectedIndex, string name, string anchorElementId)
{ 
// this will create student name details viewmodel for selected name and modify StudentViewModel object.
// for example
StudentDetailsViewModel vm = StudentVM[selectedIndex].DetailsVM;

//since user made selection update few properties in vm

StudentVM[selectedIndex].DetailsVM = vm;

//Second insert
// make sure to set tempdata before RenderPartialViewToString
TempData["StudentViewModel"] = StudentVM;

string sHtml = this.RenderPartialViewToString("~/Views/_PartialStudentDetailsPopup.cshtml", vm);

 return Json(new
            {
                Success = true,
                data = StudentVM,
                PartialViewHtml = sHtml,
                JsonRequestBehavior.AllowGet
            });
}

Во всплывающем окне StudentDetails.cshtml у меня так

<div>
.....
 <input class="ButtonLikeHyperLink"
         id="@buttonId"
          onclick="OnUserSelectStudentDetails()"
          value="[Select]"
          type="button" />     

  //Second read
 //in fiddler innertext is show as null                            
<span id="lblHDNStudentDetailsViewModel">
 @Newtonsoft.Json.JsonConvert.SerializeObject(TempData["StudentViewModel"] as StudentViewModel)
</span>
</div>

Классконтроллер.js

function OnUserSelectStudentDetails()
{

 var inputParam = {};

 var hiddenField = document.getElementById("lblHDNStudentDetailsViewModel");
  if (hiddenField != null)
  {        
     //hiddenField.innerText is null
     inputParam.StudentVM = JSON.parse(hiddenField.innerText);

      var retVal = __FAFdoCallback("OnUserSelectLenderMatchingFee", inputParam);
        ...
    }
}

Классконтроллер.cs

public JsonResult OnUserSelectLenderMatchingFee(StudentViewModel StudentVM)
{
//StudentVM is null here
}

ОБНОВЛЕНИЕ

РЕШЕНИЕ

Я чувствую себя очень глупо в этом вопросе. Как сказал великий сыщик Эркюль Пуаро: «Великие серые клетки не работают», в данном случае моя тоже не сработала. Иногда мы думаем так далеко от рамок, что смотрим на основы. Я думал, что это нельзя сделать так просто, поэтому я думал о TempData и т. Д. И забыл фундаментальный момент, что в моем родительском всплывающем окне уже есть скрытое поле, и я могу читать из него и записывать в него в моих методах javascript. родительских и дочерних всплывающих окон и передать их методам действий контроллера и вернуть обновленную и согласованную модель.

Приняв это базовое решение, я сделал это

Студенты.cshtml

<span id="lblHDNStudentViewModel">  
@Newtonsoft.Json.JsonConvert.SerializeObject(Model)
</span>

Прочитайте это в методе javascript родительского окна, как показано ниже в ClassController.js

function ShowStudentDetails(selectedIndex, name, anchorElementId)
{
    var inputParam = {};

    //read
    var hiddenField = document.getElementById("lblHDNStudentViewModel");
}

Прочитайте это из метода javascript дочернего окна, как показано ниже в ClassController.js

function OnUserSelectStudentDetails()
{

 var inputParam = {};

 // read in child window and access parent window element
  var hiddenField = window.opener.document.getElementById("lblHDNStudentViewModel");
}

Запись обратно в элемент родительского окна из метода javascript родительского окна, как показано ниже.

document.getElementById("lblHdnCDLenderViewModel").innerText = JSON.stringify(postedData.data);

Запишите обратно в элемент родительского окна из метода javascript дочернего окна, как показано ниже.

window.opener.document.getElementById("lblHdnCDLenderViewModel").innerText = JSON.stringify(postedData.data);

person Ziggler    schedule 19.04.2016    source источник
comment
Ваш последний пример кода должен быть помечен ClassController.js? Он имеет код С#...   -  person Mister Epic    schedule 20.04.2016
comment
@ Мистер .. Я обновил ..   -  person Ziggler    schedule 20.04.2016