public async Task <ActionResult <string> > RegisterNewUser([FromBody] RegisterUserViewModel registerUser) { if (ModelState.IsValid) { var user = new LMSUser { UserName = registerUser.Email, Email = registerUser.Email, FirstName = registerUser.FirstName, LastName = registerUser.LastName }; var Role = registerUser.Role; var result = await _userManager.CreateAsync(user, registerUser.Password); if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); var ok = await _userManager.AddToRoleAsync(user, Role); if (!ok.Succeeded) { throw new Exception(string.Join("\n", ok.Errors)); } /* var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); * var callbackUrl = Url.Page( * "/Account/ConfirmEmail", * pageHandler: null, * values: new { userId = user.Id, code = code }, * protocol: Request.Scheme); * * await _emailSender.SendEmailAsync(registerUser.Email, "Confirm your email", * $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); */ // teacher makes users so no log in. // await _signInManager.SignInAsync(user, isPersistent: false); var res = Json(new { Name = user.Id }); return(Created("", res)); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // If we got this far, something failed, redisplay form return(StatusCode(500, ModelState)); }
private async Task LoadAsync(LMSUser user) { var email = await _userManager.GetEmailAsync(user); Email = email; Input = new InputModel { NewEmail = email, }; IsEmailConfirmed = await _userManager.IsEmailConfirmedAsync(user); }
private async Task LoadAsync(LMSUser user) { var userName = await _userManager.GetUserNameAsync(user); var phoneNumber = await _userManager.GetPhoneNumberAsync(user); Username = userName; Input = new InputModel { PhoneNumber = phoneNumber }; }
public async Task <IActionResult> OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); if (ModelState.IsValid) { var user = new LMSUser { UserName = Input.Email, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName }; var Role = Input.Role; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); var ok = await _userManager.AddToRoleAsync(user, Role); if (!ok.Succeeded) { throw new Exception(string.Join("\n", ok.Errors)); } var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); // teacher makes users so no log in. // await _signInManager.SignInAsync(user, isPersistent: false); return(LocalRedirect(returnUrl)); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // If we got this far, something failed, redisplay form return(Page()); }
private async Task LoadSharedKeyAndQrCodeUriAsync(LMSUser user) { // Load the authenticator key & QR code URI to display on the form var unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user); if (string.IsNullOrEmpty(unformattedKey)) { await _userManager.ResetAuthenticatorKeyAsync(user); unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user); } SharedKey = FormatKey(unformattedKey); var email = await _userManager.GetEmailAsync(user); AuthenticatorUri = GenerateQrCodeUri(email, unformattedKey); }
private static async Task NewUser(string adminPW, UserManager <LMSUser> userManager, string email) { var fake = new Faker(); var user = new LMSUser { UserName = email, Email = email, FirstName = fake.Name.FirstName(), LastName = fake.Name.LastName() }; var result = await userManager.CreateAsync(user, adminPW); if (!result.Succeeded) { throw new Exception(string.Join("\n", result.Errors)); } }
public async Task <IActionResult> OnPostConfirmationAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); // Get the information about the user from the external login provider var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { ErrorMessage = "Error loading external login information during confirmation."; return(RedirectToPage("./Login", new { ReturnUrl = returnUrl })); } if (ModelState.IsValid) { var user = new LMSUser { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user); if (result.Succeeded) { result = await _userManager.AddLoginAsync(user, info); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent : false); _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); return(LocalRedirect(returnUrl)); } } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } LoginProvider = info.LoginProvider; ReturnUrl = returnUrl; return(Page()); }
public async Task <ActionResult <string> > UpdateUser([FromBody] ManageUserViewModel registerUser) { if (ModelState.IsValid) { var user2 = await _userManager.FindByNameAsync(User.Identity.Name); var user = new LMSUser { UserName = registerUser.Email, Email = registerUser.Email, FirstName = registerUser.FirstName, LastName = registerUser.LastName }; // var Role = registerUser.Role; user2.FirstName = registerUser.FirstName; user2.LastName = registerUser.LastName; if (User.Identity.Name != registerUser.Email) { throw new AccessViolationException("User tryed to update other user"); } if (registerUser.Password != "") {// then try to update password var changePasswordResult = await _userManager.ChangePasswordAsync(user2, registerUser.Oldpassword, registerUser.Password); if (!changePasswordResult.Succeeded) { _logger.LogInformation("Failed to update Password by user"); foreach (var error in changePasswordResult.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } else { _logger.LogInformation("Password updated by user"); } } var result = await _userManager.UpdateAsync(user2); if (result.Succeeded) { _logger.LogInformation("User updated by user"); // var roles = await _userManager.GetRolesAsync(user2); /*if (!roles.Contains(Role)) * { * _logger.LogInformation("User role updated by user"); * var ok2 = await _userManager.RemoveFromRoleAsync(user2, roles[0]); * if (!ok2.Succeeded) * { * ModelState.AddModelError(string.Empty, string.Join("\n", ok2.Errors)); * } * var ok = await _userManager.AddToRoleAsync(user2, Role); * if (!ok.Succeeded) * { * ModelState.AddModelError(string.Empty, string.Join("\n", ok.Errors)); * } * }*/ } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } if (ModelState.Count > 0) { // errors return(StatusCode(500, ModelState)); } var res = Json(new { status = true }); return(Ok(res)); } return(StatusCode(500, ModelState)); }
public async Task <ActionResult <string> > UpdateUserAdmin([FromBody] ManageUserViewModel registerUser) { if (ModelState.IsValid) { var user = new LMSUser { UserName = registerUser.Email, Email = registerUser.Email, FirstName = registerUser.FirstName, LastName = registerUser.LastName }; var Role = registerUser.Role; var user2 = await _userManager.FindByIdAsync(registerUser.Id); user2.FirstName = registerUser.FirstName; user2.LastName = registerUser.LastName; var result = await _userManager.UpdateAsync(user2); if (result.Succeeded) { _logger.LogInformation("User updated by admin"); var roles = await _userManager.GetRolesAsync(user2); if (!roles.Contains(Role)) { _logger.LogInformation("User role updated by Admin"); var ok2 = await _userManager.RemoveFromRoleAsync(user2, roles[0]); if (!ok2.Succeeded) { throw new Exception(string.Join("\n", ok2.Errors)); } var ok = await _userManager.AddToRoleAsync(user2, Role); if (!ok.Succeeded) { throw new Exception(string.Join("\n", ok.Errors)); } } /* var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); * var callbackUrl = Url.Page( * "/Account/ConfirmEmail", * pageHandler: null, * values: new { userId = user.Id, code = code }, * protocol: Request.Scheme); * * await _emailSender.SendEmailAsync(registerUser.Email, "Confirm your email", * $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); */ // teacher makes users so no log in. // await _signInManager.SignInAsync(user, isPersistent: false); var res = Json(new { status = true }); return(Ok(res)); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // If we got this far, something failed, redisplay form return(StatusCode(500, ModelState)); }
/// <summary> /// Seeds users and testdata if not already in db /// </summary> /// <param name="serviceProvider">serviceProvider</param> /// <param name="admins">Admin users</param> /// <param name="users">User Users</param> /// <returns>Void</returns> public static async Task Initialize(IServiceProvider serviceProvider, UserData[] admins, UserData[] users) { using (var context = new ApplicationDbContext( serviceProvider.GetRequiredService <DbContextOptions <ApplicationDbContext> >())) { // init testusers var userManager = serviceProvider.GetService <UserManager <LMSUser> >(); var roleManager = serviceProvider.GetRequiredService <RoleManager <IdentityRole> >(); if (roleManager == null || userManager == null) { throw new Exception("roleManager or userManager is null"); } var roleNames = new[] { ConstDefine.R_TEACHER, ConstDefine.R_STUDENT }; foreach (var name in roleNames) { // init roles if (await roleManager.RoleExistsAsync(name)) { continue; } var role = new IdentityRole { Name = name }; var result = await roleManager.CreateAsync(role); if (!result.Succeeded) { throw new Exception(string.Join("\n", result.Errors)); } } // teachers var Temails = admins.Select(u => u.UserName); foreach (var email in Temails) { if ((await userManager.FindByEmailAsync(email)) != null) { continue; } var user = new LMSUser { UserName = email, Email = email }; var result = await userManager.CreateAsync(user, admins.Where(u => u.UserName == email).Select(u => u.PassWord).FirstOrDefault()); if (!result.Succeeded) { throw new Exception(string.Join("\n", result.Errors)); } var adminUser = await userManager.FindByNameAsync(email); if ((await userManager.GetRolesAsync(adminUser)).Count() == 0) { var ok = await userManager.AddToRoleAsync(adminUser, ConstDefine.R_TEACHER); if (!ok.Succeeded) { throw new Exception(string.Join("\n", ok.Errors)); } } } var Semails = users.Select(u => u.UserName); foreach (var email in Semails) { if ((await userManager.FindByEmailAsync(email)) != null) { continue; } var user = new LMSUser { UserName = email, Email = email }; var result = await userManager.CreateAsync(user, users.Where(u => u.UserName == email).Select(u => u.PassWord).FirstOrDefault()); if (!result.Succeeded) { throw new Exception(string.Join("\n", result.Errors)); } var adminUser = await userManager.FindByNameAsync(email); if ((await userManager.GetRolesAsync(adminUser)).Count() == 0) { var ok = await userManager.AddToRoleAsync(adminUser, ConstDefine.R_STUDENT); if (!ok.Succeeded) { throw new Exception(string.Join("\n", ok.Errors)); } } } if (context.Courses.Count() == 0) //0 men inte null. { if (context.Courses.FirstOrDefault(c => c.Name == "NA18") == null) { // add a course await context.Courses.AddAsync(new Course { Name = "NA18", Description = "Kurs i .net core och C#", StartDate = DateTime.Parse("2018-11-26 09:00:00") }); await context.SaveChangesAsync(); } var courseid = context.Courses.FirstOrDefault(c => c.Name == "NA18")?.Id; if (context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Programmering i C#") == null) { await context.Modules.AddAsync(new Module { Name = "C#", Description = "Programmering i C#", StartDate = DateTime.Parse("2018-11-26 09:00:00"), EndDate = DateTime.Parse("2018-12-07 17:00:00"), CourseId = courseid.Value }); await context.SaveChangesAsync(); } var moduleid = context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Programmering i C#")?.Id; if (context.LMSActivity.FirstOrDefault(a => a.ModuleId == moduleid) == null) { await context.LMSActivity.AddRangeAsync(new List <LMSActivity> { new LMSActivity { Name = "EL1", Description = "Intro + E-L 1.1, 1.2", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-26 09:00:00"), EndDate = DateTime.Parse("2018-11-26 17:00:00") }, new LMSActivity { Name = "EL2", Description = "E-L 1.3", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-27 09:00:00"), EndDate = DateTime.Parse("2018-11-27 12:00:00") }, new LMSActivity { Name = "EL3", Description = "E-L 1.4 + 1.5", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-27 13:00:00"), EndDate = DateTime.Parse("2018-11-27 17:00:00") }, new LMSActivity { Name = "FR1", Description = "Frl C# Intro", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-28 09:00:00"), EndDate = DateTime.Parse("2018-11-28 17:00:00") }, new LMSActivity { Name = "OV2", Description = "Övning 2", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-29 09:00:00"), EndDate = DateTime.Parse("2018-11-29 17:00:00") }, new LMSActivity { Name = "FR2", Description = "Frl C# Grund", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-11-30 09:00:00"), EndDate = DateTime.Parse("2018-11-30 17:00:00") }, new LMSActivity { Name = "EL4", Description = "E-L 1.6 + 1.7", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-03 09:00:00"), EndDate = DateTime.Parse("2018-12-03 12:00:00") }, new LMSActivity { Name = "EL5", Description = "E-L 1.8", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-03 13:00:00"), EndDate = DateTime.Parse("2018-12-03 17:00:00") }, new LMSActivity { Name = "FR2", Description = "FRL OOP", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-04 09:00:00"), EndDate = DateTime.Parse("2018-12-04 17:00:00") }, new LMSActivity { Name = "OV3", Description = "Övning 3", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-05 09:00:00"), EndDate = DateTime.Parse("2018-12-05 17:00:00") }, new LMSActivity { Name = "FR3", Description = "FRL OOP 2", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-06 09:00:00"), EndDate = DateTime.Parse("2018-12-06 17:00:00") }, new LMSActivity { Name = "OV3", Description = "Övning 3", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-07 09:00:00"), EndDate = DateTime.Parse("2018-12-07 17:00:00") }, }); } if (context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "C#") == null) { await context.Modules.AddAsync(new Module { Name = "C#", Description = "C#", StartDate = DateTime.Parse("2018-12-10 09:00:00"), EndDate = DateTime.Parse("2018-12-14 17:00:00"), CourseId = courseid.Value }); await context.SaveChangesAsync(); } moduleid = context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "C#")?.Id; if (context.LMSActivity.FirstOrDefault(a => a.ModuleId == moduleid) == null) { await context.LMSActivity.AddRangeAsync(new List <LMSActivity> { new LMSActivity { Name = "EL6", Description = "E-L 2.1 - 2.4", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-10 09:00:00"), EndDate = DateTime.Parse("2018-12-10 12:00:00") }, new LMSActivity { Name = "OV4", Description = "Övning 4", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-10 13:00:00"), EndDate = DateTime.Parse("2018-12-10 17:00:00") }, new LMSActivity { Name = "FR4", Description = "FRl Generics", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-11 09:00:00"), EndDate = DateTime.Parse("2018-12-11 17:00:00") }, new LMSActivity { Name = "EL7", Description = "E-L 2.5 – 2.6 ", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-12 09:00:00"), EndDate = DateTime.Parse("2018-12-12 12:00:00") }, new LMSActivity { Name = "OV4", Description = "Övning 4", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-12 13:00:00"), EndDate = DateTime.Parse("2018-12-12 17:00:00") }, new LMSActivity { Name = "FR4", Description = "FRL Generics", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-13 09:00:00"), EndDate = DateTime.Parse("2018-12-13 12:00:00") }, new LMSActivity { Name = "FR5", Description = "FRL LINQ", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-13 13:00:00"), EndDate = DateTime.Parse("2018-12-13 17:00:00") }, new LMSActivity { Name = "EL8", Description = "E-L 2.7 – 2.9", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-14 09:00:00"), EndDate = DateTime.Parse("2018-12-14 12:00:00") }, new LMSActivity { Name = "OV4", Description = "Övning 4", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-14 13:00:00"), EndDate = DateTime.Parse("2018-12-14 17:00:00") }, }); } if (context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Testning") == null) { await context.Modules.AddAsync(new Module { Name = "C#", Description = "Testning", StartDate = DateTime.Parse("2018-12-17 09:00:00"), EndDate = DateTime.Parse("2018-12-18 17:00:00"), CourseId = courseid.Value }); await context.SaveChangesAsync(); } moduleid = context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Testning")?.Id; if (context.LMSActivity.FirstOrDefault(a => a.ModuleId == moduleid) == null) { await context.LMSActivity.AddRangeAsync(new List <LMSActivity> { new LMSActivity { Name = "EL9", Description = "Unit Test E-L Test ", ActivityTypeId = 1, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-17 09:00:00"), EndDate = DateTime.Parse("2018-12-17 17:00:00") }, new LMSActivity { Name = "FR6", Description = "FRL/Ariktektur", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-18 09:00:00"), EndDate = DateTime.Parse("2018-12-18 12:00:00") }, new LMSActivity { Name = "FR7", Description = "FRL/Test", ActivityTypeId = 2, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-18 13:00:00"), EndDate = DateTime.Parse("2018-12-18 17:00:00") }, }); } if (context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Garage 1.0") == null) { await context.Modules.AddAsync(new Module { Name = "C#", Description = "Garage 1.0", StartDate = DateTime.Parse("2018-12-19 09:00:00"), EndDate = DateTime.Parse("2019-01-02 17:00:00"), CourseId = courseid.Value }); await context.SaveChangesAsync(); } moduleid = context.Modules.FirstOrDefault(u => u.CourseId == courseid && u.Name == "C#" && u.Description == "Garage 1.0")?.Id; if (context.LMSActivity.FirstOrDefault(a => a.ModuleId == moduleid) == null) { await context.LMSActivity.AddRangeAsync(new List <LMSActivity> { new LMSActivity { Name = "OVG1", Description = "Övning Garage 1.0", ActivityTypeId = 3, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-19 09:00:00"), EndDate = DateTime.Parse("2018-12-28 12:00:00") }, new LMSActivity { Name = "AN1", Description = "Redovisning", ActivityTypeId = 5, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2018-12-28 13:00:00"), EndDate = DateTime.Parse("2018-12-28 17:00:00") }, new LMSActivity { Name = "AN1", Description = "Redovisning", ActivityTypeId = 5, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2019-01-02 09:00:00"), EndDate = DateTime.Parse("2019-01-02 12:00:00") }, new LMSActivity { Name = "AN2", Description = "Kodgenomgång", ActivityTypeId = 5, ModuleId = moduleid.Value, StartDate = DateTime.Parse("2019-01-02 13:00:00"), EndDate = DateTime.Parse("2019-01-02 17:00:00") }, }); } // Add student to course var students = await userManager.GetUsersInRoleAsync(ConstDefine.R_STUDENT); foreach (var student in students) { if (context.CourseUsers.FirstOrDefault(cu => cu.LMSUserId == student.Id) == null) { await context.CourseUsers.AddAsync( new CourseUser { CourseId = courseid.Value, LMSUserId = student.Id }); } } await context.SaveChangesAsync(); } } }
public async Task <IActionResult> OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); if (ModelState.IsValid) { var user = new LMSUser { UserName = Input.Email, Email = Input.Email }; //var result = await _userManager.CreateAsync(user, Input.Password); // Use the adminPW as the default password when creating new users // TODO: Having a default password is a temp solution and should be fixed var defaultPassword = _config["KEY"]; var result = await _userManager.CreateAsync(user, defaultPassword); if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); // Add user to role var userRole = await _userManager.AddToRoleAsync(user, Input.Role); if (!userRole.Succeeded) { throw new Exception(string.Join("\n", userRole.Errors)); } // Add user to course var userCourse = new LMSUserCourse { CourseId = Input.CourseId, LMSUserId = user.Id }; _context.Add(userCourse); _context.SaveChanges(); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { area = "Identity", userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); if (_userManager.Options.SignIn.RequireConfirmedAccount) { return(RedirectToPage("RegisterConfirmation", new { email = Input.Email })); } else { //await _signInManager.SignInAsync(user, isPersistent: false); return(LocalRedirect(returnUrl)); } } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // If we got this far, something failed, redisplay form return(Page()); }