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

Razor Pages下拉列表提交时存储显示值而非主键Key的方法

问题根源

SelectList构造函数的第二个参数是用来指定下拉选项<option>标签value属性绑定的实体字段,你当前代码传的是"ID",所以渲染出的所有选项value都是分类表主键,表单提交时默认会把选中项的value值绑定到InfoSite.ResType属性,最终存入数据库的自然是主键值而非显示文本。

快速修改方案

直接调整视图中SelectList的字段绑定配置,将值字段从主键ID改为你需要存储的Description字段即可,修改后的下拉控件代码:

<select asp-for="InfoSite.ResType" id="Select1" class="form-select" asp-items="@(new SelectList(Model.DisplayResCatData,"Description", "Description"))">
    <option value="" selected disabled>---Select Residence Type---</option>
</select>

修改后渲染出的选项value和显示文本都会取Description字段的值,表单提交时ResType接收到的就是选中的分类显示文本,直接执行存库逻辑就能满足需求。

更稳妥的推荐方案

如果后续可能出现重名分类、或者需要防范前端参数篡改,建议不要修改前端value绑定,在后端提交逻辑中根据传入的主键ID查询对应显示文本再赋值,这种方式更符合常规开发规范,不需要改动视图代码,只需要调整OnPost方法:

public async Task<IActionResult> OnPost()
{
    // 传入的ResType此时是分类ID,查询对应分类实体
    if (int.TryParse(InfoSite.ResType, out int catId))
    {
        var selectedCategory = await _db.ResCategory.FindAsync(catId);
        if (selectedCategory != null)
        {
            // 赋值为需要存储的显示文本
            InfoSite.ResType = selectedCategory.Description;
        }
    }
    
    await _db.InfoSite.AddAsync(InfoSite);
    await _db.SaveChangesAsync();
    TempData["success"] = "Site Information added successfully.";
    return RedirectToPage("Index");
}

两种方案都只需要少量代码调整即可实现需求,你可以根据自己的业务场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:36:10