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

ASP.NET Core 3.1编辑页员工下拉框绑定报格式错误如何解决?

错误原因
  • 核心问题:ASP.NET Core Identity默认的IdentityUser.Id是字符串类型(Guid格式),你的模型里EmployeeId也明确声明为string类型,但你在视图中调用ToSelectListItem时强行用Convert.ToInt32()转换EmployeeId,编辑页中EmployeeId已经有实际的Guid字符串值,无法转换为Int32,因此抛出FormatException。
  • 附加问题1:你的编辑控制器代码中没有给视图模型的User属性赋值,即便类型问题解决,下拉框也会没有员工选项。
  • 附加问题2:原有编辑控制器中ChecklistVM.Checklists == null的判断逻辑缺少return,即便匹配不到数据也会继续执行返回视图的逻辑。
  • 为什么创建页正常:创建页中Checklists.EmployeeId为null,Convert.ToInt32(null)默认返回0,不会触发类型转换错误,因此能正常加载。
解决方案

步骤1:修改ToSelectListItem扩展方法的参数类型

把接收选中值的参数从int改为string,匹配Identity的Id类型:

using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
using System.Linq;

namespace Checklist.Extensions
{
    public static class IEnumerableExtension
    {
        public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, string selectedValue)
        {
            return from item in items
                   select new SelectListItem
                   {
                       Text = item.GetPropertyValue("Name"),
                       Value = item.GetPropertyValue("Id"),
                       Selected = item.GetPropertyValue("Id").Equals(selectedValue)
                   };
        }
    }
}

步骤2:修改视图中的下拉框调用代码

去掉Convert.ToInt32转换,直接传入字符串类型的EmployeeId:

<div class="col-5">
  <select asp-for="Model.Checklists.EmployeeId" name="EmployeeId" id="EmployeeId" asp-items="Model.User.ToSelectListItem(Model.Checklists.EmployeeId)" class="form-control"></select>
</div>

步骤3:修复编辑控制器逻辑

补充User属性赋值、补全NotFound返回逻辑:

// GET - EDIT
public async Task<IActionResult> Edit(int? id)
{
    if(id == null)
    {
        return NotFound();
    }

    ChecklistVM.Checklists = await _db.Checklist.Include(m => m.Customer).Include(m => m.CustomerSite).SingleOrDefaultAsync(m => m.Id == id);
    if (ChecklistVM.Checklists == null)
    {
        // 补全return
        return NotFound();
    }
    ChecklistVM.CustomerSite = await _db.CustomerSite.Where(s => s.CustomerId == ChecklistVM.Checklists.CustomerId).ToListAsync();
    // 新增:查询所有用户填充下拉框
    ChecklistVM.User = await _db.Users.ToListAsync();

    return View(ChecklistVM);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 20:24:02