为什么值不保留在回传上?

我的主页有一个产品选项列表,每个选项在注册时为用户提供不同的帐户级别。每个选项都显示一个“注册”按钮,将用户带到/Identity/Account/Register页面进行注册。

我需要向注册页面传达用户选择的选项。

  1. 我不能使用 Sessions,因为它显然被拿走了

  2. 我不能使用 Cookies 因为它显然已经被拿走了

  3. 当我提交表单时,ViewData 值不会保留

  4. 当我提交表单时,查询字符串值不会保留

  5. 当我提交表单时,全局变量值不会保留

  6. 最初加载页面时,我无法设置视图模型的属性(NullReferenceException)

当注册页面加载时,该值就在那里,但是当我提交表单时,它就消失了。

我不知所措。我打算通过什么机制来获得这些必需的信息?

在大多数情况下,我的代码几乎只是标准的样板文件:

[AllowAnonymous]

public class RegisterModel : PageModel

{

    private readonly SignInManager<ApplicationUser> _signInManager;

    private readonly UserManager<ApplicationUser> _userManager;

    private readonly ILogger<RegisterModel> _logger;

    private readonly IEmailSender _emailSender;


    public RegisterModel(

        UserManager<ApplicationUser> userManager,

        SignInManager<ApplicationUser> signInManager,

        ILogger<RegisterModel> logger,

        IEmailSender emailSender)

    {

        _userManager = userManager;

        _signInManager = signInManager ?? throw new ArgumentNullException(nameof(signInManager));

        _logger = logger;

        _emailSender = emailSender;

    }


    [BindProperty]

    public InputModel Input { get; set; }

    [BindProperty]

    public int AccountLevel { get; set; }

    public string ReturnUrl { get; set; }


    public void OnGet(string returnUrl = null, int acclevel = 1)

    {

        AccountLevel = acclevel;

        ReturnUrl = returnUrl;

    }


    public async Task<IActionResult> OnPostAsync(string returnUrl = null, int acclevel = 0)

    {

        returnUrl = returnUrl ?? Url.Content("~/");


        if (ModelState.IsValid)

        {

            if (acclevel == 0) throw new ArgumentException(nameof(acclevel));


            Input.LicenseCount = acclevel * 10;


            var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email, Name = Input.FirstName, Surname = Input.Surname, PhoneNumber = Input.PhoneNumber, SaIdNumber = Input.IdNumber, LicensesCount = Input.LicenseCount };



斯蒂芬大帝
浏览 172回答 2
2回答

MM们

注意:我不使用 Razor Pages,所以了解该技术的人可能会有更好的答案。您可以在表单中使用隐藏字段来保留 POST-back 中的值:<form asp-route-returnUrl="@Model.ReturnUrl" method="post">&nbsp; &nbsp; @Html.HiddenFor(model => model.AccountLevel)&nbsp; &nbsp; @*OR, TagHelper way*@&nbsp; &nbsp; <input asp-for="AccountLevel" type="hidden"/>&nbsp; &nbsp; <h4>Create a new account.</h4>&nbsp; &nbsp; ....</form>启用会话后,使用会话也很容易做到这一点:public void OnGet(string returnUrl = null, int acclevel = 1){&nbsp; &nbsp; HttpContext.Session.SetInt32("AccountLevel", acclevel);&nbsp; &nbsp; ReturnUrl = returnUrl;}public async Task<IActionResult> OnPostAsync(string returnUrl = null){&nbsp; &nbsp; int accountLevel = HttpContext.Session.GetInt32("AccountLevel");&nbsp; &nbsp; ...}

HUH函数

请求后唯一存在的数据是与该请求一起发送的数据。即使在会话的情况下,关键会话标识符也必须由客户端在请求中传输到服务器以恢复该会话。您从数据库中检索到的任何数据都必须重新发布或查询。此外,不应发布不允许用户明确更改的数据。因此,大多数数据应该重新查询。至于用户选择的选项,当然应该发布。但是,应该通过再次查询该数据库来获取所选计划和其他计划选项的实际详细信息。这将是必要的,例如,如果由于验证错误而需要在发布后重新显示表单。
打开App,查看更多内容
随时随地看视频慕课网APP