c# - 如何将 ViewModel 对象添加到 TempData

标签 c# tempdata asp.net-core-5.0

我有以下 Controller ,其 View 模型如下 -

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Initiate(IFormCollection formCollection)
{
    var studentId = formCollection["studentid"].ToString();

    if (string.IsNullOrEmpty(studentId))
    {
        return NotFound(new { msg = "Unknown student" });
    }

    Student student = await _context.Students.Include(s=>s.Parents).FirstOrDefaultAsync(s=>s.Id==studentId).ConfigureAwait(false);

    var dashboard = User.FindFirstValue(ClaimTypes.Role).ToLower();

    if (formCollection["bill"].Count > 0)
    {
        //Calculate the total bills and present a payment confirmation page
        List<int> billIds = new List<int>();
        foreach (var id in formCollection["bill"])
        {
            billIds.Add(Convert.ToInt32(id));
        }

        if (billIds.Count > 0)
        {
            List<Fee> fees = await _context.Fees.Where(f => billIds.Contains(f.Id)).ToListAsync().ConfigureAwait(false);

            string CustomerEmail = null;
            string CustomerPhone = null;
            string CustomerFirstName = null;
            string CustomerLastName = null;

            if (student.Parents.Any())
            {
                var parent = student.Parents.FirstOrDefault();

                CustomerEmail = parent?.Email;
                CustomerPhone = parent?.PhoneNumber;
                CustomerFirstName = parent?.OtherNames;
                CustomerLastName = parent?.Surname;
            }
            string TrxnRef = RandomStringGenerator.UpperAlphaNumeric(5) + student.Id.Substring(0,8);

            BillsPayViewModel model = new BillsPayViewModel
            {
                StudentId=student.Id,
                StudentName=student.FullName,
                PaymentItems=fees,
                TransactionRef= TrxnRef,
                CustomerPhone = CustomerPhone ?? student.PhoneNumber,
                CustomerEmail = CustomerEmail ?? student.Email,
                CustomerFirstname = CustomerFirstName ?? student.OtherNames,
                CustomerLastname = CustomerLastName ?? student.Surname,
                CustomerFullname=$"{CustomerFirstName} {CustomerLastName}", 
                Currency = "NGN",
                AmountToPay=fees.Sum(a=>a.Amount),
                Callbackurl=$"/Payments/Status/{TrxnRef}"
            };

            TempData["PaymentDetails"] = model;
            return View("BillsPayConfirmation", model);
        }
    }
    else
    {
        TempData["msg"] = "<div class='alert alert-success'><i class='fa fa-check'></i> No outstanding bills found for student</div>";

        return RedirectToAction(dashboard, "dashboard");
    }
    return RedirectToAction();
}

我意识到当我添加将模型添加到临时数据的部分时

TempData["PaymentDetails"] = model;

我得到以下内容

enter image description here

有没有办法将整个模型添加到 TempData 中,这样我就不需要在下一页上重复生成 ViewModel 的过程?

最佳答案

经过一番挣扎,我发现了this SO question这给了我一个关于问题所在的线索,事实证明问题是 ASP.NET Core 中的 TempData (可能从版本 5 开始,因为我没有在其他版本中尝试过)没有能力包含一个对象。

我试图向 TempData 添加一个对象,这就是问题的根源。解决方案是首先序列化模型,然后将其添加到 TempData,然后将其反序列化回我需要使用它的对象,如下所示

  TempData["PaymentDetails"] = JsonConvert.SerializeObject(model);

在我需要它的地方,将其反序列化回来,如下

BillsPayViewModel paymentDetails = JsonConvert.DeserializeObject<BillsPayViewModel>((string)TempData["PaymentDetails"]);

我想这会节省很多时间。

关于c# - 如何将 ViewModel 对象添加到 TempData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66659565/

相关文章:

c# - 表架构到数据表 C#

python - 临时目录在程序运行期间持续存在

asp.net-mvc - 在 ASP.NET MVC 中使用 Tempdata - 最佳实践

asp.net-mvc - 发布到 Azure 时 TempData 不起作用

c# - 为什么 IL.Emit 方法要添加额外的 nop 指令?

c# - 返回类型 T 不能返回为 null? C#泛型

c# - 在 C# 中的相似类型之间进行转换

c# - 带参数的 .NET 5 路由

c# - 为什么 ApiAuthorization 在 .NET 5 中不起作用

asp.net-core-5.0 - 警告 CS0618 : 'ComplexTypeModelBinder' is obsolete