C# Razor页面在类方法之间保存数据

C# Razor页面在类方法之间保存数据,c#,asp.net-core-mvc,razor-pages,C#,Asp.net Core Mvc,Razor Pages,我最近在尝试在razor页面上编写站点时遇到的问题是,当我在类方法中使用变量时,它不会将数据保存在内部。例如:我有一个在创建页面时创建数据的方法。当我按下submit按钮时:数据在类中不会被记住,因此返回null 我尝试过使用数据绑定、临时数据和私有类。他们都没有将数据保存在一个类中以备将来使用。目前的代码是: ` namespace TestSite.Pages.Shared { 公共类注册模式:PageModel { 私有只读TestSite.Data.ApplicationDbContex

我最近在尝试在razor页面上编写站点时遇到的问题是,当我在类方法中使用变量时,它不会将数据保存在内部。例如:我有一个在创建页面时创建数据的方法。当我按下submit按钮时:数据在类中不会被记住,因此返回null

我尝试过使用数据绑定、临时数据和私有类。他们都没有将数据保存在一个类中以备将来使用。目前的代码是:

`

namespace TestSite.Pages.Shared
{
公共类注册模式:PageModel
{
私有只读TestSite.Data.ApplicationDbContext\u上下文;
公共用户管理器\u用户;
公共字符串_ID{get;set;}
公共字符串_代码{get;set;}
已验证的公共文件;
公共注册模型(UserManager UserManager,ApplicationDbContext上下文)
{
_上下文=上下文;
_user=UserManager;
}
公共IActionResult OnGet()
{
var CurrentUser=\u context.Simple\u User.FirstOrDefault(m=>m.ID==Guid.Parse(\u User.GetUserId(User));
if(CurrentUser==null)
{
_ID=\u user.GetUserId(用户);
_代码=生成代码();
_验证=假;
TempData[“ID”]=\u ID;
TempData[“代码”]=\u代码;
返回页();
}else{return Redirect(“/Index”);}
}
[BindProperty]
公共简单用户简单用户{get;set;}
公共异步任务OnPostAsync()
{
Simple_User.ID=Guid.Parse((字符串)TempData[“ID”]);
Simple_User.Code=(字符串)TempData[“Code”];
Simple_User.Validated=false;
如果(!ModelState.IsValid)
{
返回页();
}
_context.Simple\u User.Add(Simple\u User);
wait_context.SaveChangesAsync();
返回页首(“/索引”);
}
私有字符串GenerateCode()
{
随机_Random=新随机();
返回$“{u random.Next(10009999.ToString()}-{DateTime.Now.Year}”;
}
}
}
`

和HTML:

`

@{
ViewData[“Title”]=“第二次注册”;
}
第二次注册
只剩一步了。在您首次注册后,您必须填写一些空格,然后,我们的主持人将检查并将您添加到我们的列表中。

身份证件 代码 返回列表 @节脚本{ @{wait Html.RenderPartialAsync(“_validationScript”);}
}`


基本上,站点在一个不可访问的字段中显示一些值,当它在数据库中创建一个简单的用户时应该使用它。但到目前为止,我只得到空值

HTTP是无状态的™. 如果要在执行一个请求期间设置对象的属性,并使这些值可用于后续请求,则需要实现自己的状态管理策略

根据你想做什么,你有很多选择。如果安全性很重要,那么应该查看会话变量。同时,以下是所有可用选项:

试试看。你可以扔掉创建/详细信息/删除页面,只保留编辑页面,如果这是你想要的。创建新页面时,可以从命令行或在Visual Studio中执行此操作。类似于CLI中的以下内容(有关更多详细信息,请参阅)


此外,如果您希望在post中发送您的_ID或_Code属性,请为其添加[BindProperty]属性。有关模型绑定的更多信息,请参阅。

哪些数据未被记住?您期望的行为是什么?\u ID和\u代码。我的预期行为是,在onGet()方法中生成的值将被保留,因此我可以在onPostAsync()方法中使用它们,并使用这些值创建用户。在表单中具有隐藏字段,您可以通过表单提交传递数据。隐藏字段可以通过web控制台进行修改。我正在寻找一种不同的方法,用户不能修改它,那么您应该在Httppost操作中再次阅读它,类似于您在get中所做的
namespace TestSite.Pages.Shared
{
    public class Registration_2Model : PageModel
    {
        private readonly TestSite.Data.ApplicationDbContext _context;

        public UserManager<IdentityUser> _user;

        public string _ID { get; set; }
        public string _Code { get; set; }

        public bool _Validated;

        public Registration_2Model(UserManager<IdentityUser> UserManager, ApplicationDbContext context)
        {
            _context = context;
            _user = UserManager;
        }

        public IActionResult OnGet()
        {
            var CurrentUser = _context.Simple_User.FirstOrDefault(m => m.ID == Guid.Parse(_user.GetUserId(User)));
            if (CurrentUser == null)
            {
                _ID = _user.GetUserId(User);
                _Code = GenerateCode();
                _Validated = false;

                TempData["ID"] = _ID;
                TempData["Code"] = _Code;

                return Page();
            } else { return Redirect("/Index"); }
        }

        [BindProperty]
        public Simple_User Simple_User { get; set; }

        public async Task<IActionResult> OnPostAsync()
        {
            Simple_User.ID = Guid.Parse((string)TempData["ID"]);
            Simple_User.Code = (string)TempData["Code"];
            Simple_User.Validated = false;

            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Simple_User.Add(Simple_User);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }

        private string GenerateCode()
        {
            Random _random = new Random();
            return $"{_random.Next(1000, 9999).ToString()}-{DateTime.Now.Year}";
        }
    }
}
@{
    ViewData["Title"] = "Second registration";
}

<h2>Second registration</h2>

<h4>One step left. After your initial registration, you must fill in some blanks, after which, our moderator will check and add you to our list.</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label class="control-label">ID</label>
                <input class="form-control" type="text" placeholder="@Model._ID" readonly />
            </div>
            <div class="form-group">
                <label asp-for="Simple_User.Name" class="control-label"></label>
                <input asp-for="Simple_User.Name" class="form-control" />
                <span asp-validation-for="Simple_User.Name" class="text-danger"></span>
                <span asp-validation-for="Simple_User.Code" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label class="control-label">Code</label>
                <input class="form-control" type="text" placeholder="@Model._Code" readonly />
            </div>
            <div class="form-group">
                <label asp-for="Simple_User.Address" class="control-label"></label>
                <input asp-for="Simple_User.Address" class="form-control" />
                <span asp-validation-for="Simple_User.Address" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
dotnet aspnet-codegenerator razorpage -m SimpleUser -dc ApplicationDbContext