【问题标题】:Persist IEnumerable<T> after server side validation ASP.Net Core MVC在服务器端验证 ASP.Net Core MVC 后坚持 IEnumerable<T>
【发布时间】:2020-09-08 13:53:03
【问题描述】:

我正在使用here 所述的服务器端验证。在页面的 OnGet 方法中,我使用数据库中的项目列表填充 IEnumerable。

    [BindProperty]
    public IEnumerable<Status> Statuses { get; set; }

    public async Task<IActionResult> OnGetAsync()
    {
        Statuses = await _service.GetStatuses();
        return Page();
    }

当 ModelState.IsValid 返回 false 时,页面会重新显示,但 IEnumerable 的内容现在为零。

public async Task<IActionResult> OnPostAsync()
{
        if (!ModelState.IsValid)
        {
            return new PageResult();
        }
        ... Save to DB
 }

如果我复制 Statues = await _service.GetStatues(); 是否有一种简单的方法来持久化 IEnumerable;在返回页面()之前;它可以工作,但这需要再次访问数据库,所以我想尽可能避免。 View中是否需要有一个隐藏字段来存储IEnumerable的完整列表?

感谢任何帮助。

【问题讨论】:

  • 你试过“TempData”吗? @RaKer
  • @WaleedNaveed 是的,我已经尝试将列表添加到 Tempdata 但页面然后只返回 HTTP 500,但在返回 Page() 上设置断点;行,我可以看到 Tempdata 已更新 - 我是否遗漏了其他内容?
  • 你能分享代码@RaKer
  • @WaleedNaveed,代码就像这个 public async Task OnGetAsync() { Statuses = await _service.GetStatuses(); TempData["状态"] = 状态; TempData.Keep("状态");返回页面(); }

标签: asp.net-core razor-pages


【解决方案1】:

我尝试将列表添加到 Tempdata 但页面只是 返回 HTTP 500,

此错误表明您应该将状态直接存储在 TempData 中。

其实我们在传递对象数据的时候,需要将其序列化为json格式,然后存入TempData中,再通过反序列化得到

试试下面的代码:

using Newtonsoft.Json;
   
   [BindProperty]
    public IEnumerable<Status> Statuses { get; set; }

    public async Task<IActionResult> OnGetAsync()
    {
        Statuses = await _service.GetStatuses();
        TempData["Statuses"] = JsonConvert.SerializeObject(Statuses);
        return Page();
    }
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            Statuses = JsonConvert.DeserializeObject<IEnumerable<Status>>(TempData["Statuses"].ToString());
            return new PageResult();
        }
        return RedirectToPage("./Index");
    }

【讨论】:

  • 这很完美,可以满足我的需求。感谢您解释需要序列化存储在 TempData 中的数据。
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多