【问题标题】:Passing data through RedirectToPage通过 RedirectToPage 传递数据
【发布时间】:2021-09-30 01:11:45
【问题描述】:

我有一个正在处理的 ASP.NET Core RazorPages 访问者管理项目,我需要使用 RedirectToPage 方法将一个类的实例从一个页面传递到另一个页面。
流程:访问者首先在创建页面上填写他们的信息,信息被发布到数据库,然后访问者的实例被传递到第二个页面,在该页面中数据被格式化并截屏以将 jpeg 发布到访问者在数据库中的实例。
我一直在尝试其他帖子中建议的数据传递方法,但在将 MVC 转换为 RazorPages 时遇到了困难。我认为我不能使用 TempData 或 ViewData ,因为我需要发布到数据库并添加到数据库中的特定访问者条目中,所以我一直在查看 Microsoft 关于 RedirectToPage 方法的文档以及@ 987654321@关于不同的方法。我想我需要将 PRG 模式方法与 RedirectToPage(string, string, string) 一起使用,它接受参数 pageName、pageHandler 和 fragment。我遇到问题的部分是调用访问者实例时第二个页面模型的代码 (RegistrationSuccess.cshtml.cs)。

这是来自 Create.cshtml.cs 的相关代码:

 public class CreateModel : PageModel
{
    private readonly VisitorManagementSystem.Data.VisitorManagementSystemContext _context;
    [BindProperty]
    public Visitor Visitor { get; set; }

    public CreateModel(VisitorManagementSystem.Data.VisitorManagementSystemContext context)
    {
       _context = context;
    }

    public IActionResult OnGet()
    {
        return Page();
    }
        
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        //....
        _context.Visitor.Add(Visitor);
        await _context.SaveChangesAsync();
        return RedirectToPage("./RegistrationSuccess", "Visitor", new { visitorId  = Visitor.ID.ToString() });
    }
}

RegistrationSuccess.cshtml.cs

public class RegistrationSuccessModel : PageModel
{
    [BindProperty]
    public Visitor Visitor { get; set; }
    private readonly VisitorManagementSystem.Data.VisitorManagementSystemContext _context;
    public RegistrationSuccessModel(VisitorManagementSystem.Data.VisitorManagementSystemContext context)
    {
        _context = context;
    }
    
    //This is where I'm not sure what the correct syntax is to call the instance of the visitor
    public IActionResult OnGet(string visitorId)
    {
        //from the visitorId value, get the object
        Visitor = VisitorManagementSystem.GetVisitor(visitorId);
        return Page();
    }
    public async Task<IActionResult> OnPostAsync()
    {
        return RedirectToPage("/Visitors/RegistrationSuccess");
    }
}

我尝试过使用 RedirectToPage(string, object) 方法,但这有两个问题:所有访问者的信息都显示在 URL 中,这似乎不安全;另外,我收到错误“无法访问此站点 ERR_HTTP2_PROTOCOL_ERROR”
我是新手,感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

    您应该添加到 RegistrationSuccess.cshtml.cs 剃须刀页面的顶部

    @page "{visitorId}"
    

    从行动开始

      return RedirectToPage("./RegistrationSuccess", new { visitorId  = Visitor.ID.ToString() });
    

    并修复操作

    public IActionResult OnGet(string visitorId)
        {
       if (!string.IsNullOrEmpty(visitorId))
    Visitor = _context.Set<Visitor>().FirstOrDefault( i=> i.VisitorId==visitorId);
    return Page();
    
        }
    

    【讨论】:

    • 当我进行这些更改时,RegistrationSuccess 仍然无法调用访问者——它会抛出 System.NullReferenceException:'Object reference not set to an instance of an object'。我需要在 RegistrationSuccess.cshtml.cs 的 OnGet 方法中更改/添加什么吗? (Visitor = VisitorManagementSystem.GetVisitor(visitorId) 无法识别)
    • @PacifismPostMortem 最重要​​的是您是否在获取 RegistrationSuccessModel 时获得了 visitorId?在哪里声明了 VisitorManagementSystem ?你用它来GetVisitor(visitorId);
    • @PacifismPostMortem 你试过 Visitor = _context.Set().FirstOrDefault( i=> i.VisitorId==visitorId); ?
    • 很抱歉,直到我发表评论后才看到您的编辑;解决了这个问题。感谢您的帮助!
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多