【问题标题】:TempData with same key with multiple values asp.net core mvc具有多个值的相同键的 TempData asp.net core mvc
【发布时间】:2021-10-12 16:28:54
【问题描述】:

我正在阅读temp data 并想知道您是否可以将 tempdata 与两个单独的键一起使用并为其添加多个值。即

TempData["Id"] = "1";

TempData["Name"] = "Bob";

然后我们在临时数据中添加另一组值:

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

在动作方法中使用它们:

public ActionResult Index()
{

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

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

然后在另一个操作方法中访问它,而无需覆盖键的值,只需给出最后一组 id 和 name:

public ActionResult About()
{

    int id;
    string name;

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

}

About() 操作方法中访问它时,有没有办法显示 Bob 和 Jill 的 ID 以及他们的名字,而不仅仅是返回 2 作为 ID 和 Jill 作为名称?

【问题讨论】:

标签: c# asp.net-mvc asp.net-core-mvc tempdata


【解决方案1】:

此代码使用 VS 2019 和 Newtonsoft.Json nuget 包进行测试

您可以通过这种方式将复杂数据保存在 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
    }
}

【讨论】:

  • 这很可靠!感谢您提供详细的解决方案,很高兴这是可能的!
  • 在调试About() 方法时,它告诉我....InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure.DefaultTempDataSerializer' cannot serialize an object of type 'System.Collections.Generic.List1[TestApp.Models.IdName]'.`
  • @MarkCo 对此感到抱歉。我通常在发布前进行测试。我修复了代码。
  • 不用担心,我很感激!在About() 的for 循环内部,我执行item.Id = Convert.ToInt32(TempData["IdNames"]); item.Name = TempData["IdNames"].ToString(); 并且每当我点击第一行item.id 时,它都会告诉我System.FormatException:'输入字符串格式不正确'。我在网上查了这个错误,发现解决这个问题的方法是item.Id = 1 * Convert.ToInt32(TempData["IdNames"]);,但是当我尝试这个时,我仍然得到同样的错误。我不明白为什么说如果 Id 是 int 类型并且我在 forloop 中将其转换为 int。
  • @MarkCo 你只是用错了方法。在循环内部,您必须使用 var id= item.Id;变量名称=项目。名称。 item 没有任何设置器,您只能读取它。检查我更新的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多