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

如何在MVC中填充下拉框并将选中ID传递至控制器

看起来你遇到的问题是下拉框选中的ID没法正确传递到Post动作的itemID参数里对吧?这其实是MVC模型绑定的名称匹配问题,我给你几个实用的解决方案:

首先先理清楚你的现有代码:

你的控制器代码:

[HttpGet]
public ActionResult CreateTipoProyecto()
{
    ViewBag.Categorias = _dbContext.Categoria.ToList();
    return View();
}

[HttpPost]
public ActionResult CreateTipoProyecto(TipoProyectoDto tipoProyectoDto, Guid itemID)
{
    //执行操作....
    return View();
}

你的视图代码:

@Html.DropDownList("CategoriaId", (IEnumerable<EbanTabs.Models.Categoria>)ViewBag.Categorias)
//其他代码...

解决方案1:让参数名称和下拉框名称匹配

MVC的模型绑定是按参数/属性名称匹配表单元素name的,你现在下拉框的name是CategoriaId,但Post动作里接收的参数是itemID,两者名称不匹配,所以绑定不上。

你有两种选择:

  • 修改Post动作的参数名(更推荐,语义化更强):
    [HttpPost]
    public ActionResult CreateTipoProyecto(TipoProyectoDto tipoProyectoDto, Guid CategoriaId)
    {
        // 现在CategoriaId就是下拉框选中的分类ID了
        // 执行你的操作....
        return View();
    }
    
  • 修改下拉框的name属性:
    @Html.DropDownList("itemID", (IEnumerable<EbanTabs.Models.Categoria>)ViewBag.Categorias)
    

解决方案2:优化下拉框的构造(更规范)

默认直接传IEnumerable<Categoria>给DropDownList,它会用对象的ToString()方法显示文本,这大概率不是你想要的效果。最好提前构造SelectList指定显示文本和值字段:

  1. 修改Get动作:
    [HttpGet]
    public ActionResult CreateTipoProyecto()
    {
        // 假设你的Categoria实体有Id(Guid类型)和Nombre(显示名称)字段
        ViewBag.CategoriaOptions = new SelectList(_dbContext.Categoria.ToList(), "Id", "Nombre");
        return View();
    }
    
  2. 视图里使用:
    @Html.DropDownList("CategoriaId", (SelectList)ViewBag.CategoriaOptions, "请选择一个分类")
    
    这样下拉框会正确显示分类名称,值为对应的分类Id。

解决方案3:用强类型绑定(最佳实践)

如果你的视图是强类型的(比如@model TipoProyectoDto),可以在Dto里添加CategoriaId属性:

public class TipoProyectoDto
{
    // 其他属性...
    public Guid CategoriaId { get; set; }
}

然后Get动作还是构造SelectList,视图里用DropDownListFor:

@Html.DropDownListFor(m => m.CategoriaId, (SelectList)ViewBag.CategoriaOptions, "请选择一个分类")

这样Post的时候,选中的ID会自动绑定到tipoProyectoDto.CategoriaId里,你就不用单独加参数了,代码更整洁规范。


最后注意:确保下拉框在表单内

一定要把下拉框放在Html.BeginForm生成的表单里,不然提交的时候不会把值传过去:

@using (Html.BeginForm("CreateTipoProyecto", "YourControllerName", FormMethod.Post))
{
    @Html.DropDownListFor(m => m.CategoriaId, (SelectList)ViewBag.CategoriaOptions, "请选择一个分类")
    <!-- 其他表单元素 -->
    <button type="submit">提交</button>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:59