You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 7 Razor Pages提交错误后下拉列表为空问题求助

.NET Core 7 Razor Pages 提交失败后保留下拉列表数据问题

我正在使用**.NET Core 7和Razor Pages**开发新增页面,需要在页面上做分类选择。OnGetAsync()方法里从数据库获取分类信息传到页面,这一步正常。提交表单时,OnPostAddAsync()执行保存操作,若保存出错,我用return Page()来保留用户输入内容,但此时下拉列表的分类信息会消失。不想用RedirectToPage(),因为会丢失用户输入,请问怎么在保留输入的同时重新填充分类下拉列表?

我的OnGetAsync()方法

public async Task<IActionResult> OnGetAsync()
{
    var response = await _category.List(SessionValues()[0]);

    if (response.Message == "Authentication Error")
    {
        HttpContext.Session.Remove("userToken");
        HttpContext.Session.Remove("userInfo");

        return new RedirectToPageResult("Login");
    }

    if (response.Status)
    {
        List<SelectListItem> List = new List<SelectListItem>();

        foreach (var item in response.Data)
        {
            List.Add(new SelectListItem
            {
                Value = item.Id.ToString(),
                Text = item.Name
            });

            Options = List;
        }
    }
    else
    {
        ToastrError = response.Message;
    }

    return Page();
}

我的OnPostAddAsync()方法

public async Task<IActionResult> OnPostAddAsync(AddRequestModel addModel)
{
    var response = await _product.Add(SessionValues()[0]);

    if (response.Message == "Authentication Error")
    {
        HttpContext.Session.Remove("userToken");
        HttpContext.Session.Remove("userInfo");

        return new RedirectToPageResult("Login");
    }

    if (response.Status)
    {
        ToastrSuccess = response.Message;
        return new RedirectToPageResult("Add");
    }

    ToastrError = response.Message;
    return Page();
}

当保存出错时,代码会携带错误信息执行return Page(),此时下拉列表为空。

我使用的属性

[ViewData]
public string ToastrError { get; set; }

[TempData]
public string ToastrSuccess { get; set; }

public AddRequestModel addModel { get; set; }

public List<SelectListItem> Options { get; set; }

解决方案

问题核心是return Page()不会自动触发OnGetAsync()的下拉加载逻辑,所以需要在提交失败的分支里手动重新加载分类数据。

1. 提取加载分类的公共方法

把OnGetAsync()里的分类加载逻辑抽成独立方法,避免重复代码:

private async Task LoadCategoriesAsync()
{
    var response = await _category.List(SessionValues()[0]);

    if (response.Message == "Authentication Error")
    {
        HttpContext.Session.Remove("userToken");
        HttpContext.Session.Remove("userInfo");
        throw new InvalidOperationException("Authentication Error");
    }

    if (response.Status)
    {
        Options = response.Data.Select(item => new SelectListItem
        {
            Value = item.Id.ToString(),
            Text = item.Name
        }).ToList();
    }
    else
    {
        ToastrError = response.Message;
    }
}

2. 简化OnGetAsync()方法

修改原OnGetAsync(),调用公共方法:

public async Task<IActionResult> OnGetAsync()
{
    try
    {
        await LoadCategoriesAsync();
    }
    catch (InvalidOperationException ex)
    {
        if (ex.Message == "Authentication Error")
        {
            return new RedirectToPageResult("Login");
        }
        throw;
    }

    return Page();
}

3. 在提交失败分支重新加载分类

修改OnPostAddAsync(),保存失败时先加载分类数据,再返回页面:

public async Task<IActionResult> OnPostAddAsync(AddRequestModel addModel)
{
    var response = await _product.Add(SessionValues()[0]);

    if (response.Message == "Authentication Error")
    {
        HttpContext.Session.Remove("userToken");
        HttpContext.Session.Remove("userInfo");
        return new RedirectToPageResult("Login");
    }

    if (response.Status)
    {
        ToastrSuccess = response.Message;
        return new RedirectToPageResult("Add");
    }

    ToastrError = response.Message;
    // 重新加载分类数据
    try
    {
        await LoadCategoriesAsync();
    }
    catch (InvalidOperationException ex)
    {
        if (ex.Message == "Authentication Error")
        {
            return new RedirectToPageResult("Login");
        }
        throw;
    }
    // 保留用户输入的表单数据
    this.addModel = addModel;
    return Page();
}

补充说明

  • 抽公共方法是为了统一维护分类加载逻辑,后续修改只需调整一处。
  • 必须把提交的addModel赋值给页面的addModel属性,才能保留用户输入的内容。
  • 身份验证错误的判断可以改用自定义异常,比字符串匹配更规范。

内容的提问来源于stack exchange,提问作者OsKyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:35:35