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

如何结合Entity Framework实现HTML下拉选择框二选一输入

实现仅允许选择Internal/Consigned的方案

1. 模型层添加合法性验证

在Equipment类的InternalConsigned属性上添加正则验证,确保只能传入指定的两个值,同时拦截非法请求:

public class Equipment
{
    [Key]
    public int Id { get; set; }

    [Required]
    [DisplayName("Equipment Name")]
    public string Name { get; set; }

    [Required]
    public int Amount { get; set; }

    [Required]
    public string Status { get; set; }

    [ForeignKey("DepartmentId")]
    public int DepartmentId { get; set; }
    public Department? Department { get; set; }

    [Required]
    // 限制仅能输入Internal或Consigned
    [RegularExpression(@"^(Internal|Consigned)$", ErrorMessage = "请选择有效的选项:Internal 或 Consigned")]
    public string InternalConsigned { get; set; }

    public DateTime EOLDate { get; set; }
}

2. 控制器层传递选项到视图

需要在GET版Create方法中传递下拉选项到视图,同时在POST验证失败时重新传递选项(避免返回视图时下拉框为空):

GET Create方法(若未定义则补充)

public IActionResult Create()
{
    // 传递部门下拉选项
    ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name");
    // 传递Internal/Consigned选项集合
    ViewData["InternalConsignedOptions"] = new List<SelectListItem>
    {
        new SelectListItem { Text = "Internal", Value = "Internal" },
        new SelectListItem { Text = "Consigned", Value = "Consigned" }
    };
    return View();
}

POST Create方法修改

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,Amount,Status,DepartmentId,InternalConsigned,EOLDate")] Equipment equipment)
{
    if (ModelState.IsValid)
    {
        _context.Add(equipment);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    // 验证失败时重新传递部门选项
    ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name", equipment.DepartmentId);
    // 重新传递Internal/Consigned选项,并保留用户之前的选择
    ViewData["InternalConsignedOptions"] = new List<SelectListItem>
    {
        new SelectListItem { Text = "Internal", Value = "Internal", Selected = equipment.InternalConsigned == "Internal" },
        new SelectListItem { Text = "Consigned", Value = "Consigned", Selected = equipment.InternalConsigned == "Consigned" }
    };
    return View(equipment);
}

3. 视图层替换为下拉选择框

将Create.cshtml中原InternalConsigned的输入框替换为下拉选择框:

<div class="form-group">
    <label asp-for="InternalConsigned" class="control-label"></label>
    <select asp-for="InternalConsigned" class="form-control" asp-items="ViewBag.InternalConsignedOptions"></select>
    <span asp-validation-for="InternalConsigned" class="text-danger"></span>
</div>

补充说明

  • 前端下拉框从交互层限制了用户选择范围,模型层的正则验证则从数据层面拦截非法请求,双重保障数据合法性。
  • 若需要更严谨的类型约束,也可将InternalConsigned改为枚举类型,进一步降低出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:05:15