Заранее спасибо. Пожалуйста, извините меня за мою грамматику. Я изо всех сил старался объяснить свою проблему. В своем стремлении решить приведенный ниже вопрос я сначала начал разрабатывать 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);
ClassController.js
? Он имеет код С#... - person Mister Epic   schedule 20.04.2016