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

Razor Page中基于泛型列表实现CreateDto的HTML渲染问题

Razor Page 渲染泛型列表属性的解决方案

首先明确:Html.GetEnumSelectList<T>仅适用于枚举类型,如果Projekt是普通实体类(而非枚举),自然无法用这个方法生成选项。以下是针对实体类列表的渲染方案:

1. 后端准备数据

在Razor Page的PageModel中,先从数据源(数据库/接口)获取Projekt列表,并作为属性传递给视图:

public class YourPageModel : PageModel
{
    private readonly YourDbContext _db;

    public YourPageModel(YourDbContext db)
    {
        _db = db;
    }

    [BindProperty]
    public CreateDto CreateDto { get; set; }
    public IEnumerable<Projekt> ProjektList { get; set; }

    public async Task OnGetAsync()
    {
        // 初始化CreateDto,多选场景必须初始化列表
        CreateDto = new CreateDto();
        CreateDto.ProjektIds = new List<int>();
        
        // 获取Projekt数据
        ProjektList = await _db.Projekts.ToListAsync();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            // 验证失败重新加载列表
            ProjektList = await _db.Projekts.ToListAsync();
            return Page();
        }
        // 处理保存逻辑
        return RedirectToPage("./Index");
    }
}

2. 前端渲染方案

根据业务需求(单选/多选)选择对应方式:

单选下拉框(绑定单个ProjektId)

如果CreateDto包含int ProjektId属性,用Tag Helper方式最简洁:

<div class="form-group">
    <label asp-for="CreateDto.ProjektId" class="control-label"></label>
    <select asp-for="CreateDto.ProjektId" 
            asp-items="@(new SelectList(Model.ProjektList, "Id", "Name"))" 
            class="form-control">
        <option value="">请选择项目</option>
    </select>
    <span asp-validation-for="CreateDto.ProjektId" class="text-danger"></span>
</div>
  • 替换"Id"和"Name"为Projekt实体中实际的值字段和显示文本字段

多选场景(绑定List ProjektIds)

复选框列表(直观的多选体验)

<div class="form-group">
    <label class="control-label">选择项目</label>
    @foreach (var projekt in Model.ProjektList)
    {
        <div class="form-check">
            <input type="checkbox" 
                   asp-for="CreateDto.ProjektIds" 
                   value="@projekt.Id" 
                   class="form-check-input" />
            <label class="form-check-label">@projekt.Name</label>
        </div>
    }
    <span asp-validation-for="CreateDto.ProjektIds" class="text-danger"></span>
</div>

多选下拉框

<div class="form-group">
    <label asp-for="CreateDto.ProjektIds" class="control-label"></label>
    <select asp-for="CreateDto.ProjektIds" 
            asp-items="@(new SelectList(Model.ProjektList, "Id", "Name"))" 
            multiple="multiple" 
            class="form-control">
    </select>
    <span asp-validation-for="CreateDto.ProjektIds" class="text-danger"></span>
</div>

关键注意事项

  • 多选场景下必须在OnGet中初始化CreateDto.ProjektIds = new List<int>(),否则模型绑定会失败
  • 确保Projekt实体的字段名与SelectList中指定的字段一致,避免找不到属性的错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:21