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

ASP.NET中如何基于Category表为Item创建DropdownList(SelectList)

ASP.NET中创建Item时绑定Category下拉列表的解决方案

后端实现(Controller层)

假设你使用Entity Framework Core操作数据库,在ItemController的Create方法中获取Category数据并生成SelectList,传递到视图:

Public Class ItemController
    Private _context As YourDbContext ' 替换为项目实际的DbContext类名

    Public Sub New(context As YourDbContext)
        _context = context
    End Sub

    ' GET: Item/Create
    Public Function Create() As IActionResult
        ' 查询所有分类数据
        Dim categories = _context.Category.ToList()
        ' 生成SelectList:Value绑定CAG_Idx,Text绑定CAG_Name
        ViewBag.CategoryOptions = New SelectList(categories, "CAG_Idx", "CAG_Name")
        Return View()
    End Function

    ' POST: Item/Create
    <HttpPost>
    <ValidateAntiForgeryToken>
    Public Function Create(<Bind("ITM_Idx,CAR_Idx")> item As Item) As IActionResult
        If ModelState.IsValid Then
            _context.Add(item)
            _context.SaveChanges()
            Return RedirectToAction("Index")
        End If
        ' 验证失败时重新生成下拉列表,避免视图丢失选项
        Dim categories = _context.Category.ToList()
        ViewBag.CategoryOptions = New SelectList(categories, "CAG_Idx", "CAG_Name")
        Return View(item)
    End Function
End Class

前端实现(View视图)

在Create.cshtml中使用Html.DropDownListFor绑定Item的CAR_Idx属性,同时添加验证提示:

@ModelType YourNamespace.Item ' 替换为项目实际的命名空间

@{
    ViewData("Title") = "创建Item";
}

<h1>创建Item</h1>

<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="CAR_Idx" class="control-label">分类</label>
                @Html.DropDownListFor(Function(model) model.CAR_Idx, ViewBag.CategoryOptions As SelectList, "请选择分类", New With {.class = "form-control"})
                <span asp-validation-for="CAR_Idx" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="创建" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">返回列表</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

优化方案:使用ViewModel(推荐)

如果想更贴合MVC最佳实践,可创建ViewModel类封装Item和下拉列表数据:

Public Class ItemCreateViewModel
    Public Property Item As Item
    Public Property CategoryOptions As SelectList
End Class

修改Controller的Create方法:

Public Function Create() As IActionResult
    Dim categories = _context.Category.ToList()
    Dim viewModel = New ItemCreateViewModel With {
        .CategoryOptions = New SelectList(categories, "CAG_Idx", "CAG_Name")
    }
    Return View(viewModel)
End Function

<HttpPost>
<ValidateAntiForgeryToken>
Public Function Create(viewModel As ItemCreateViewModel) As IActionResult
    If ModelState.IsValid Then
        _context.Add(viewModel.Item)
        _context.SaveChanges()
        Return RedirectToAction("Index")
    End If
    viewModel.CategoryOptions = New SelectList(_context.Category.ToList(), "CAG_Idx", "CAG_Name")
    Return View(viewModel)
End Function

对应视图调整:

@ModelType YourNamespace.ItemCreateViewModel

@{
    ViewData("Title") = "创建Item";
}

<!-- 其他代码不变,下拉列表绑定改为 -->
@Html.DropDownListFor(Function(model) model.Item.CAR_Idx, Model.CategoryOptions, "请选择分类", New With {.class = "form-control"})

注意事项

  • 确保Item实体的CAR_Idx与Category实体的CAG_Idx类型一致,若需配置外键关联,可在Item类添加特性:<ForeignKey("CAR_Idx")> Public Property Category As Category,或在DbContext中用Fluent API配置。
  • 替换代码中的YourDbContext、YourNamespace为项目实际的类名和命名空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:13:25