使用数据从 Razor 页面重定向

Dmy*_*tro 4 c# razor asp.net-core razor-pages

我需要通过重定向来传递集合。但“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 });
                }
}
Run Code Online (Sandbox Code Playgroud)

我的目标页面处理程序:

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

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

        this.errorsList = errorsList;

        return Page();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ena 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);
Run Code Online (Sandbox Code Playgroud)

可以传递数据的唯一参数是routeValued,但不能将复杂对象作为路由数据传递。路由数据功能仅支持 int 和 string 等简单对象。如果你想跨请求保留更复杂的对象,你需要使用Sessionsor 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");
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述