В настоящее время я работаю над c# MVC mvc веб-приложением, но у меня возникли проблемы с выяснением, почему свойство в моей модели переходит от List к System.Collections.Generi c .List`1 [System .String] при передаче из представления в контроллер.
На мой взгляд, я перечисляю некоторые из моих моделей и предоставляет для каждой из них Actionlink, который вызывает метод ContinueStatus (), предоставляющий объект модели (состояние) в параметр:
@foreach (DriftsstatusModel status in (List<DriftsstatusModel>)ViewData["activeStatuses"])
{
@Html.ActionLink("Fortsæt", "ContinueStatus", "Home", status, new { @class = "btn btn-success btn-lg", @style = "font-size:x-large" })
}
Когда я помещаю точку останова в вышеуказанное и прокручиваю статус (объект модели), я правильно вижу, что свойство SelectedProducts имеет значение List<string>
с числом 1. Однако, когда кнопка actionlink при нажатии и вызывается метод контроллера ContinueStatus (), свойство SelectedProducts изменилось на System.Collections.Generi c .List`1 [System.String] и вместо count = 1 сообщает {string [1]}. Метод контроллера:
public ActionResult ContinueStatus(DriftsstatusModel driftsStatus)
{
// Does something, but not with SelectedProducts
return RedirectToAction("Index", driftsStatus);
}
После того, как метод контроллера Index возвращается к представлению, SelectedProducts изменилось на «System.String []» из System.Collections.Generi c .List`1 [System. String] и по-прежнему показывает {string [1]}. Поскольку SelectedProducts изменился, я не знаю, как получить доступ к одной строке, которая в настоящее время должна быть в нем. Это означает, что ветвь else всегда выбирается в следующей части моего взгляда:
<optgroup label="DLI">
@foreach (string product in dliProducts)
{
if (Model.SelectedProducts.Contains(product))
{
<option selected>@product</option>
}
else
{
<option>@product</option>
}
}
</optgroup>
Почему это происходит и как я могу это исправить?
Я попытаюсь ответить некоторые вопросы.
Я создаю веб-приложение, которое должно использоваться для отправки электронной почты и SMS-сообщений, чтобы уведомить ppl об ошибке продукта, например, что вы не можете войти в службу (продукт). Этот статус электронной почты / смс может быть запущен, продолжен и завершен, и, следовательно, необходимо загрузить более раннюю информацию с указанным c статусом, чтобы вы могли изменить ее, а затем либо продолжить (ошибка net пока исправлена), либо закрыть это (ошибка исправлена, поэтому последнее обновление статуса).
Модель DriftsstatusModel содержит всю эту информацию и имеет свойство
public List<string> SelectedProducts { get; set; }
, которое содержит выбранные параметры в мультиселекте. На мой взгляд, я тогда показываю все активные статусы, например, так (убран стиль кнопки et c.):
@foreach (DriftsstatusModel status in (List<DriftsstatusModel>)ViewData["activeStatuses"])
{
@Html.ActionLink("Fortsæt", "ContinueStatus", "Home", status, new { @class = "btn btn-success btn-lg", @style = "font-size:x-large" })
@Html.ActionLink("Afslut", "EndStatus", "Home", status, new { @class = "btn btn-danger btn-lg", @style = "font-size:x-large" })
}
здесь следует отметить, что ViewData ["activeStatuses"] заполняется в контроллере, где я получаю экземпляры DriftsstatusModel из БД, и она работает, как и ожидалось, получая всю предшествующую информацию. Также здесь статус (экземпляр DriftsstatusModel) имеет «правильные» выбранные продукты, где i в режиме отладки может видеть количество и получать доступ к элементам.
Поэтому, когда нажимается кнопка «Продолжить», выполняются два следующих действия контроллера называется:
public ActionResult ContinueStatus(DriftsstatusModel driftsStatus)
{
// Does something, but not with SelectedProducts
return RedirectToAction("Index",driftsStatus);
}
public ActionResult Index(DriftsstatusModel driftsStatus)
{
// Does something, but not with driftsStatus.SelectedProducts
ViewData["activeStatuses"] = statusDbHandler.GetActiveStatusses();
return View(driftsStatus);
}
Теперь вся информация в статусе должна быть загружена в поля в представлении, где используется мультиселект:
<select class="selectpicker w-100" data-val="true" id="SelectedProducts" name="SelectedProducts" multiple>
<optgroup label="DLI">
@foreach (string product in dliProducts)
{
if (Model.SelectedProducts.Contains(product))
{
<option selected>@product</option>
}
else
{
<option>@product</option>
}
}
</optgroup>
В этом мультиселекте я проверяю, выбран ли SelectedProducts уже содержит некоторые параметры, и если это так, я хочу, чтобы эти параметры уже были выбраны и, таким образом:
<option SELECTED>@product</option>
Однако, поскольку SelectedProducts почему-то здесь не то же самое, что в месте, где я перечисляю активные статусы, это никогда не бывает правдой Почему выбранные продукты изменились, я просто не могу понять ...
Надеюсь, это поможет