使用数据从 Razor 页面重定向

问题描述 投票:0回答:2

我需要通过重定向来传递集合。但“RedirectToPage”仅通过 GET 请求发送。

还有另一种方式,通过重定向发送数据吗?

public class ListModel : PageModel
{
    List<Entity> CreationResults = new List<Entity>();

    if (Results.Any(x => x.Message == "Object was not created."))
                {
                    foreach (var item in Results)
                    {
                        CreationResults.Add(item);
                    }
                    
                    return RedirectToPage("CreateError", new { errorsList = Results });
                }
}

我的目标页面处理程序:

public class CreateError : PageModel
{
 public List<Entity> errorsList { get; set; }

    public async Task<IActionResult> OnGetAsync(List<Entity> errorsList)
    {

        this.errorsList = errorsList;

        return Page();
    }
}
c# asp.net-core razor razor-pages
2个回答
6
投票

对于

RedirectToPage
,它包含以下贡献者:

public virtual RedirectToPageResult RedirectToPage(string pageName);
    
public virtual RedirectToPageResult RedirectToPage();

public virtual RedirectToPageResult RedirectToPage(object routeValues);
    
public virtual RedirectToPageResult RedirectToPage(string pageName, object routeValues);
   
public virtual RedirectToPageResult RedirectToPage(string pageName, string pageHandler, object routeValues);

public virtual RedirectToPageResult RedirectToPage(string pageName, string pageHandler, object routeValues, string fragment);

public virtual RedirectToPageResult RedirectToPage(string pageName, string pageHandler, string fragment);

您可以传递数据的唯一参数是

routeValues
,但您不能将复杂对象作为路线数据传递。路由数据功能仅支持 int 和 string 等简单对象。如果你想跨请求保留更复杂的对象,你需要使用
Sessions
TempData

对于

TempData
,它使用Session,Session本身也使用
IDistributedCache
IDistributedCache
没有能力接受对象或序列化对象。

这是工作演示,如下所示:

索引.cshtml.cs:

public IActionResult OnGet()
{
    var model = new List<Entity>()
    {
        new Entity(){ error="aaa"},
        new Entity(){ error="nbb"}
    };
    //for asp.net core 2.x,you could use NewtonSoft.Json -----JsonConvert.SerializeObject(model);

    //this is for asp.net core 3.x by using System.Text.Json
    TempData["errorsList"] = JsonSerializer.Serialize(model);          
    return RedirectToPage("CreateError");
}

CreateError.cshtml.cs:

public class CreateError : PageModel
{
    public List<Entity> errorsList { get; set; }

    public async Task<IActionResult> OnGetAsync()
    {

        var data = TempData["errorsList"] as string;
        //for asp.net core 2.x ------JsonConvert.DeserializeObject<List<Entity>>(data)
        //for asp.net core 3.x
        this.errorsList = JsonSerializer.Deserialize<List<Entity>>(data);
        return Page();
    }
}

结果:


3
投票

使用 TempData 将数据从一个请求持久保存到另一个请求

  • 当多个数据需要数据时,对于重定向很有用 请求

TempData["errorsList"] = errorsList;
© www.soinside.com 2019 - 2024. All rights reserved.