Я пытаюсь передать List<int>
из двух методов в ASP.NET Core, используя TempData[]
. В методе Category()
при получении информации productID
является null
, а TempData["Products"]
не является null
и содержит 2 числа, которые я добавил ранее - 1,2.
public IActionResult Homepage()
{
List<int> productIDs = new List<int> { 1, 2};
TempData["Products"] = productIDs;
return View();
}
public IActionResult Category(string categoryName)
{
List<int> productIDs = TempData["Products"] as List<int>;
return View();
}
@Alice: TempData
сохраняется при обработке одного запроса. Поэтому, если вы хотите переслать текущий TempData
, используйте Keep()
метод. Например, добавьте @{ TempData.Keep("Products"); }
к своему виду.
@Jackdaw данные сохраняются в TempData["Products"]
, но, похоже, есть проблема с их преобразованием в List<int>
@Алиса: Вы можете использовать var productIDs = (TempData["Products"] as IEnumerable<int>).ToList<int>;
. Это связано с тем, что TempData
неявно приводит от List<int>
к int[]
.
@Jackdaw Это сработало, спасибо! Если хотите, можете опубликовать это как ответ.
Некоторую полезную информацию о сроке службы TempData вы можете увидеть в документации:
ASP.NET Core предоставляет доступ к страницам Razor
TempData
или контроллеруTempData
. Это свойство хранит данные до тех пор, пока они не будут прочитаны в другом запросе. Для проверки данных можно использовать методыKeep(String)
иPeek(string)
. без удаления в конце запроса. Сохраняйте пометки для всех элементов в словарь для запоминания
Поэтому вот пример, как его использовать в вашем случае.
В контроллере:
public IActionResult Homepage()
{
List<int> productIDs = [1, 2];
TempData["Products"] = productIDs;
return View();
}
[HttpPost]
public IActionResult Category(string categoryName)
{
var data = new List<int>();
var key = "Products";
if (TempData.ContainsKey(key) && TempData[key] is IEnumerable<int> productsid)
{
data = productsid.ToList<int>();
}
//... using the `data`
return View();
}
Видовая сторона:
@{
var key = "Products";
var data = new List<int>();
if (TempData.ContainsKey(key) && TempData[key] is IEnumerable<int> productsid)
{
data = productsid.ToList<int>();
}
TempData.Keep(key);
}
@using (Html.BeginForm("Category", "Home", new { categoryName = "some text" }))
{
@* .... some code using the `data` *@
<button type = "submit" class = "btn btn-primary">Save</button>
}
Второй подход заключается в использовании сериализации. Для компиляции кода ниже необходимо подключить к проекту пакет Newtonsoft.Json
.
using Newtonsoft.Json;
public IActionResult HomePage()
{
var key = "Products";
List<int> productIDs = [1, 2];
TempData[key] = JsonConvert.SerializeObject(productIDs);
return View();
}
[HttpPost]
public IActionResult Category(string categoryName)
{
var key = "Products";
var data = TempData.ContainsKey(key) ? JsonConvert.DeserializeObject<List<int>>(TempData[key].ToString()) : [];
//...
return View();
}
В представлении:
@using Newtonsoft.Json;
@{
var key = "Products";
var data = TempData.ContainsKey(key)
? JsonConvert.DeserializeObject<List<int>>(TempData[key].ToString())
: [];
TempData.Keep(key);
}
....
Это решение особенно полезно, когда необходимо передать сложный объект.
лично я не слишком много работал с ядром asp.net, но, прочитав документацию о TempData, я предполагаю, что, возможно, в другой части вашего кода вы уже получили данные, а не просмотрели их.