为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
斯蒂芬大帝 2022-12-24 14:30:12
我的主页有一个产品选项列表,每个选项在注册时为用户提供不同的帐户级别。每个选项都显示一个“注册”按钮,将用户带到/Identity/Account/Register页面进行注册。我需要向注册页面传达用户选择的选项。我不能使用 Sessions,因为它显然被拿走了我不能使用 Cookies 因为它显然已经被拿走了当我提交表单时,ViewData 值不会保留当我提交表单时,查询字符串值不会保留当我提交表单时,全局变量值不会保留最初加载页面时,我无法设置视图模型的属性(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 };
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

注意:我不使用 Razor Pages,所以了解该技术的人可能会有更好的答案。


您可以在表单中使用隐藏字段来保留 POST-back 中的值:


<form asp-route-returnUrl="@Model.ReturnUrl" method="post">

    @Html.HiddenFor(model => model.AccountLevel)

    @*OR, TagHelper way*@

    <input asp-for="AccountLevel" type="hidden"/>

    <h4>Create a new account.</h4>

    ....

</form>

启用会话后,使用会话也很容易做到这一点:


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

{

    HttpContext.Session.SetInt32("AccountLevel", acclevel);

    ReturnUrl = returnUrl;

}


public async Task<IActionResult> OnPostAsync(string returnUrl = null)

{

    int accountLevel = HttpContext.Session.GetInt32("AccountLevel");

    ...

}


查看完整回答
反对 回复 2022-12-24
?
HUH函数

TA贡献1836条经验 获得超4个赞

请求后唯一存在的数据是与该请求一起发送的数据。即使在会话的情况下,关键会话标识符也必须由客户端在请求中传输到服务器以恢复该会话。

您从数据库中检索到的任何数据都必须重新发布或查询。此外,不应发布不允许用户明确更改的数据。因此,大多数数据应该重新查询。

至于用户选择的选项,当然应该发布。但是,应该通过再次查询该数据库来获取所选计划和其他计划选项的实际详细信息。这将是必要的,例如,如果由于验证错误而需要在发布后重新显示表单。


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号