【问题标题】:How to cast Tempdata as List<string>如何将 Tempdata 转换为 List<string>
【发布时间】:2019-11-29 10:50:31
【问题描述】:

我需要帮助!

我正在尝试使用 TempData 将列表从一个 ActionResult 传递到另一个。我这样做是因为我正在尝试对三个问题进行实验,其中每个视图的顺序从一开始都是随机的。

 public ActionResult Experiment() 
     {       
        List<string> stringArray = new List<string>();
        stringArray.Add("Experiment" + rn1.ToString());
        stringArray.Add("Experiment" + rn2.ToString());
        stringArray.Add("Experiment" + rn3.ToString());

        var nextExperiment = stringArray.FirstOrDefault();
        stringArray.RemoveAt(0);

        var experiment = new Experiment();
        _context.Add(experiment);
        _context.SaveChanges();

        TempData["List"] = stringArray;

        return RedirectToAction(nextExperiment, new { id = experiment.EID });
    }

但是当我试图从 stringList 读取数据时,它是空的。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Experiment1(ExperimentViewmodel experiment)
    {
        var newExperiment = new Experiment
        {
            Question1 = experiment.SelectededItem
        };

        if (ModelState.IsValid)
        {
            _context.Update(newExperiment);
            await _context.SaveChangesAsync();

            var stringList = TempData["List"] as List<string>; //stringList = null
            var nextExperiment = stringList.FirstOrDefault();  //The next view in the sequence
            stringList.RemoveAt(0);                            //Removing the view from the list since it's already been used.
            TempData["List"] = stringList;                     //Updating TempData with the new list for the next view.


            return RedirectToAction(nextExperiment, new { id = newExperiment.EID });
        }
        return View();
    }

更新:TempData["List"] 确实包含值,但我不知道如何检索数据。当我尝试将其转换为 List(这将是最佳的)时,var stringList 为空。

【问题讨论】:

  • 可能必须设置Cookie.IsEssential to true
  • 我可能错了,但就重定向而言,您似乎是从 A(实验)到 B(?)再到 C(实验 1 [帖子])。 TempData 将从 A 转到 B,然后为了将其发送到 C,您需要将其处理为一个变量(在视图中),然后将其与您的其他数据一起发布到 C。
  • 来自达科:This may be helpful resource [When to use ViewBag, ViewData, or TempData in ASP.NET](https://rachelappel.com/2014/01/02/when-to-use-viewbag-viewdata-or-tempdata-in-asp-net-mvc-3-applications/)
  • @scgough 变量 nextExperiment 是一个随机字符串,可以是 Experiment1、Experiment2 或 Experiment3。在此示例中,我从 ActionResult Experiment1 复制代码只是为了示例。感谢您的回复!
  • @PanagiotisKanavos 我不需要检索视图中的数据(我理解 ViewBag 和 ViewData 是为了。我只想将数据从一个 ActionResult 传递到同一个控制器中的另一个。谢谢回复!

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


【解决方案1】:

您必须先发布 TempData["List"] ,因为回发后会重置:

<input type="hidden" name="mylist" value="@TempData["List"]">



 [HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Experiment1(ExperimentViewmodel experiment,mylist[])
{
    var newExperiment = new Experiment
    {
        Question1 = experiment.SelectededItem
    };

    if (ModelState.IsValid)
    {
        _context.Update(newExperiment);
        await _context.SaveChangesAsync();

        var stringList = mylist as List<string>; 
        var nextExperiment = stringList.FirstOrDefault(); 
        stringList.RemoveAt(0);                           
        TempData["List"] = stringList;                  


        return RedirectToAction(nextExperiment, new { id = newExperiment.EID });
    }
    return View();
}

【讨论】:

    猜你喜欢
    • 2013-08-26
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多