Вот немного более подробный ответ, поскольку на сайте softwareengineering.stackexchange.com вы сказали, что вам по-прежнему нужна помощь в этом.
Давайте сначала убедимся, что вы правильно понимаете основы.
Когда дело доходит до передачи данных в представление, каждый контроллер в ASP.NET MVC имеет свойство с именем ViewData
, которое по сути является словарем пар ключ-значение.Само ViewData
имеет свойство под названием Model
, и это то, к чему вы обращаетесь на странице, используя синтаксис Razor @Model
.Это свойство можно использовать для передачи модели со строгой типизацией, чтобы избежать использования магических строк для ключей ViewData.
Примечание. ViewBag - это динамическая оболочка для ViewData, поэтому по сути это одно и то же (ViewBag.SomeProperty
совпадает с ViewData['SomeProperty']
);однако использование ViewBag не рекомендуется.
В действии контроллера, когда вы делаете что-то вроде return View()
, ASP.NET использует страницу cshtml в качестве шаблона для создания фактического HTML и возвращает его в качестве ответа клиенту (это все на стороне сервера).).
Существует несколько способов передачи данных в представление, которые эквивалентны, например:
ViewData.Model = someObject;
return View();
совпадает с:
return View(someObject); // the View method can accept a model object
Когдаречь идет о частичных представлениях , по умолчанию им передается копия родительской страницы ViewData
(включая ссылку на Model
), поэтому выне нужно делать ничего особенного , чтобы передать эти данные частичному представлению (но вы можете передать данные по вашему выбору, если хотите).
Помощник выбора тега визуализирует (генерирует HTML) дляэлемент select с указанными параметрами.Это тогда отправлено как HTML клиенту.На стороне клиента, когда пользователь нажимает кнопку отправки, на сервер отправляется запрос POST, который в конечном итоге обрабатывается методом PickAlert
метода AlertsController
.Если все настроено правильно, вы должны получить SelectedAlertIndex
в качестве параметра.Обратите внимание, что это происходит на стороне сервера, и теперь вам нужно снова возвращать страницу в качестве ответа.
Вы можете выбрать соответствующий объект Alert
из вашего _context
.Для этого используйте метод FirstOrDefault
вместо Where
, так как вам нужен только один элемент (если необходимо, преобразуйте типы для сравнения - например, если у вас есть строка, но вы сравниваете с int или чем-то в этом духе)).
var selectedAlert = _context.Alert.FirstOrDefault(x => x.AlertIndex == SelectedAlertIndex);
Теперь все, что вам нужно сделать, это установить selectedAlert
и любые другие данные, которые вам нужны, в качестве свойства объекта модели (или какого-либо ключа в ViewData), и отобразитьправильный вид.
Обратите внимание, что если вы просто return View(model)
не указали имя представления, система будет искать представление с тем же именем, что и у вашего метода действия (здесь, PickAlert.cshtml), поэтому используйтеreturn View("ViewName", model)
чтобы изменить это при необходимости.
Например, основываясь на коде, который вы разместили в своем вопросе, вы можете сделать что-то вроде этого:
[HttpPost]
public IActionResult PickAlert(int? SelectedAlertIndex)
{
var model = new EdxlCapMessageViewModel(/* ... params, if any */);
if (SelectedAlertIndex.HasValue)
{
ViewBag.Message = "Alert loaded successfully";
var selectedAlert = _context.Alert.FirstOrDefault(x => x.AlertIndex == SelectedAlertIndex);
// I added a property to your model to store the alert;
// if you already have one, just use that one instead.
model.SelectedAlert = selectedAlert;
}
return View("YourViewName", model);
}
YourViewName
должно быть родительским представлением, которое имеет частичноепредставления в нем (я полагаю, представление «Собранное сообщение EDXL-CAP»).
Кстати, я знаю, что то, как система передает параметры в методы действий в контроллере, может показаться немного магическим, но оно основано на соглашениях.В приведенном выше примере это работает, потому что параметр называется SelectedAlertIndex
, а объект модели имеет свойство с тем же именем (а также потому, что вы указали это свойство в помощнике тега select с помощью asp-for="SelectedAlertIndex"
).Вы также можете изменить сигнатуру метода так, чтобы он получал весь объект модели (при условии, что класс модели не слишком сложен - вы можете узнать больше о том, как работает привязка параметров здесь ):
[HttpPost]
public IActionResult PickAlert(EdxlCapMessageViewModel model)
{
// extract the index from model.SelectedAlertIndex
// you can also pass this same model object to the view
// (set some properties first if necessary)
// ...
}
Теперь для частичных просмотров.Предполагая, что вы полагаетесь на механизм по умолчанию, который передает родительские ViewData каждому частичному представлению, вам нужно изменить каждое частичное представление так, чтобы код был написан в предположении, что вы можете получить доступ к выбранному предупреждению, используя @Model.SelectedAlert
(свойство, которое выустановлено в действии PickAlert).
Например, вот простое частичное представление:
<div style="border: solid 1px #000000; padding: 30px; margin: 2px 2px 10px 2px;">
<p>The selected index is: @Model.SelectedAlert.AlertIndex</p>
</div>
Обратите внимание, что я просто использую ту же модель, что и в родительском представлении, для доступа к объекту SelectedAlert: @Model.SelectedAlert.AlertIndex
.
Опять же, при рендеринге частичных представлений, если вы не передаете никаких дополнительных параметров, ониВы получите копию словаря ViewData
и того же Model
:
@Html.Partial("_DetailsAlert");
. Если в качестве модели вы передадите что-то другое, например, только выбранное оповещение, то вам нужно изменитькод частичного представления соответственно:
@Html.Partial("_DetailsAlert", Model.SelectedAlert);
<div style="border: solid 1px #000000; padding: 30px; margin: 2px 2px 10px 2px;">
<p>The selected index is: @Model.AlertIndex</p>
</div>
Обратите внимание, что теперь в частичном представлении локальный @Model
относится к тому, что было @Model.SelectedAlert
в родительском представлении.(Другими словами, здесь @Model
имеет тип Alert
.) Это влияет только на свойство ViewData.Model
;пары ключ-значение, хранящиеся в ViewData
, остаются такими же, как в родительском представлении.