TempData с одним и тем же ключом с несколькими значениями asp.net core mvc

avatar
MarkCo
8 августа 2021 в 19:51
534
1
0

Я читал временные данные и хотел знать, можно ли использовать временные данные с двумя отдельными ключами и добавлять к ним более одного значения. То есть

TempData["Id"] = "1";

TempData["Name"] = "Bob";

тогда у нас есть еще один набор значений для добавления в tempdata:

TempData["Id"] = "2";
TempData["Name"] = "Jill";

Использование в методе действия:

public ActionResult Index()
{

    TempData["Id"] = 1;
    
    TempData["Name"] = "Bob";

    TempData["Id"] = 2;
    
    TempData["Name"] = "Jill";
}

затем доступ к этому в другом методе действия без переопределения значений ключей и просто предоставления последнего набора идентификатора и имени:

public ActionResult About()
{

    int id;
    string name;

    if (TempData.ContainsKey("Id") && TempData.ContainsKey("Name"))
    {
         id = Convert.ToInt32(TempData["Id"]);
         name = TempData["Name"].ToString();
    }

}

Есть ли способ отобразить оба идентификатора Боба и Джилл и оба их имени при доступе к нему в методе действия About(), не получая только 2 для идентификатора и Джилл для имени, возвращаемых?

Источник
pinkfloydx33
8 августа 2021 в 20:10
1

Нет. Но вы можете использовать список вместо строки и вместо этого добавить в этот список

Jackdaw
8 августа 2021 в 20:15
1

См. это сообщение: Приведение коллекции объектов из TempData (MVC C#)

MarkCo
8 августа 2021 в 21:22
0

Спасибо вам обоим!

Ответы (1)

avatar
Serge
8 августа 2021 в 20:17
1

Этот код был протестирован с использованием VS 2019 и пакета nuget Newtonsoft.Json

таким образом вы можете хранить сложные данные в tempdata

public class IdName
{
 public int Id {get;set;}
public string Name {get; set;}
}

можно использовать вот так


var idNames = new List<IdName> { 
new IdName { Name = "Bob", Id = 1 }, 
new IdName { Name = "Jill", Id = 2 } 
};
TempData["IdNames"] = JsonConvert.SerializeObject(idNames);

и ваше действие

public ActionResult About()
{

if ( TempData.ContainsKey("IdNames") ) 
{
  List<IdName> IdNames =  JsonConvert.DeserializeObject<List<IdName>>( TempData["IdNames"].ToString());

    foreach( item in IdNames)
    {

        var id= item.Id;
        var name= item.Name

         // your code
    }
}
MarkCo
8 августа 2021 в 21:24
0

Это твердо! Спасибо за подробное решение, рад, что это возможно!

MarkCo
8 августа 2021 в 22:02
0

При отладке метода About() он сообщает мне.... InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure.DefaultTempDataSerializer' cannot serialize an object of type 'System.Collections.Generic.List1[TestApp.Models.IdName]'.`

Serge
9 августа 2021 в 01:27
0

@MarkCo Извините за это. Я обычно тестирую перед публикацией. Я исправил код.

MarkCo
9 августа 2021 в 05:49
0

Не беспокойтесь, я ценю это! Внутри цикла for About() я делаю item.Id = Convert.ToInt32(TempData["IdNames"]); item.Name = TempData["IdNames"].ToString(); и всякий раз, когда я нажимаю первую строку item.id, он сообщает мне System.FormatException: «Входная строка была в неправильном формате». Я посмотрел ошибку в Интернете и увидел, что решение этой проблемы состоит в том, чтобы сделать item.Id = 1 * Convert.ToInt32(TempData["IdNames"]);, но когда я попробовал это, я все еще получаю ту же ошибку. Я не понимаю, почему он говорит, что если Id имеет тип int, и я преобразовываю его в int в forloop.

Serge
9 августа 2021 в 10:43
0

@MarkCo Вы просто используете это неправильно. Внутри цикла вы должны использовать var id= item.Id; имя переменной = элемент.Имя. item не имеет сеттера, вы можете только прочитать его. Проверьте мой обновленный ответ

MarkCo
9 августа 2021 в 13:40
0

Я вижу, теперь это имеет большой смысл. Спасибо за объяснение и помощь!