Razor Pages хранят данные между методами класса - PullRequest
0 голосов
/ 28 октября 2018

Проблема, с которой я столкнулся в последнее время, когда пытался написать сайт на бритвенных страницах - когда я использую переменные в методе класса, он не сохраняет эти данные внутри.Например: у меня есть метод, который создает данные при создании страницы.И когда я нажимаю кнопку «Отправить»: данные не запоминаются внутри класса, и поэтому они возвращают ноль.

Я пытался работать с привязкой данных, временными данными, частными классами.Ни один из них не хранил данные для будущего использования в одном классе.Текущий код:

`

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}";
        }
    }
}

`

и HTML:

`

@{
    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");}

}`

По сути, сайт отображает некоторое значение в недоступном поле и должен использовать его при создании Simple_User в базе данных.Но пока я получил только нули

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Попробуйте строительные леса страниц .Вы можете выбросить страницы Создать / Детали / Удалить и оставить только страницу Редактировать, если это то, что вы ищете.Вы можете сделать это из командной строки или в Visual Studio при создании новой страницы.Что-то вроде следующего из CLI (см. здесь для более подробной информации)

dotnet aspnet-codegenerator razorpage -m SimpleUser -dc ApplicationDbContext

Также, если вы хотите, чтобы ваши свойства _ID или _Code отправлялись в сообщении, добавьте атрибут [BindProperty]им.См. здесь для получения дополнительной информации о привязке модели.

0 голосов
/ 28 октября 2018

HTTP не имеет состояния ™.Если вы хотите установить свойства объектов во время выполнения одного запроса, и эти значения доступны для последующего запроса, вам необходимо реализовать собственную стратегию управления состоянием.

Вам доступно множество опций, в зависимости от того, что вы хотите сделать.Если безопасность важна, вы должны посмотреть на переменные сеанса.А пока вот все доступные варианты: https://www.learnrazorpages.com/razor-pages/state-management

...