【问题标题】:ASP.NET Razor Page Select List Loses Data after Server-Side Validation Failed服务器端验证失败后,ASP.NET Razor 页面选择列表丢失数据
【发布时间】:2022-12-03 06:04:59
【问题描述】:

我正在使用 .NET Identity 进行身份验证和授权。 对于我的注册页面,我在 InputModel 类中为下拉列表添加了两个 selectListItem 属性。

问题是,当服务器端验证失败时,下拉列表会在页面重新加载时丢失数据。保存其他基本数据。

我查阅了一些关于如何重新填充下拉列表的旧帖子,但仍然无法解决问题。我不知道在调用 return Page() 之后到底执行了什么。

提前致谢。

这是页面模型和方法:

public class InputModel
    {
        ......
        [Required]
        public string Name { get; set; }
        ......
        [ValidateNever]
        public IEnumerable<SelectListItem> RoleList { get; set; }
        [ValidateNever]
        public IEnumerable<SelectListItem> CompanyList { get; set; }
    }




public async Task OnGetAsync(string returnUrl = null)
    {
        ......
        ......
        Input = new InputModel()
        {
            RoleList = _roleManager.Roles.Select(x => x.Name).Select(i => new SelectListItem
            {
                Text = i,
                Value = i
            }),
            CompanyList = _unitOfWork.Company.GetAll().Select(i => new SelectListItem
            {
                Text = i.Name,
                Value = i.Id.ToString()
            })
        };
    }




public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        ......
        
        if (ModelState.IsValid)
        {
            var user = CreateUser();

            await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None);
            await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None);
            user.StreetAddress = Input.StreetAddress;
            user.City = Input.City;
            user.State = Input.State;
            user.PostalCode = Input.PostalCode;
            user.Name = Input.Name;
            user.PhoneNumber = Input.PhoneNumber;
            
            if(Input.Role == SD.Role_User_Comp)
            {
                user.CompanyId = Input.CompanyId;
            }
            var result = await _userManager.CreateAsync(user, Input.Password);

            if (result.Succeeded)
            {
                ......
                ......
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
            
                
        }

      
        // If we got this far, something failed, redisplay form
        return Page();
    }

【问题讨论】:

  • 您是否尝试返回 RedirectToPage() 而不是 Page()。我担心返回 Page() 会跳过您的 OnGet 方法和您选择的人口。我不知道这将如何影响安全性。
  • 你的下拉列表填充了什么数据?

标签: asp.net asp.net-core razor asp.net-identity


【解决方案1】:

您可以尝试将 RoleList 和 CompanyList 设置为OnPostAsync

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        ......
        
        if (ModelState.IsValid)
        {
            var user = CreateUser();

            await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None);
            await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None);
            user.StreetAddress = Input.StreetAddress;
            user.City = Input.City;
            user.State = Input.State;
            user.PostalCode = Input.PostalCode;
            user.Name = Input.Name;
            user.PhoneNumber = Input.PhoneNumber;
            
            if(Input.Role == SD.Role_User_Comp)
            {
                user.CompanyId = Input.CompanyId;
            }
            var result = await _userManager.CreateAsync(user, Input.Password);

            if (result.Succeeded)
            {
                ......
                ......
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
            
                
        }
         RoleList = _roleManager.Roles.Select(x => x.Name).Select(i => new SelectListItem
            {
                Text = i,
                Value = i
            });
            CompanyList = _unitOfWork.Company.GetAll().Select(i => new SelectListItem
            {
                Text = i.Name,
                Value = i.Id.ToString()
            });
      
        // If we got this far, something failed, redisplay form
        return Page();
    }

【讨论】:

    【解决方案2】:

    最近几天也遇到同样的问题。我用Yiyi You的方法解决了。虽然我创建了一个不同的函数来为属性赋值(在你的例子中是 RoleList 和 CompanyList)然后在 OnPostAsyncOnGetAsync 中调用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多