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
相关产品推荐
相关产品推荐

