ASP.NET MVC报错:找不到定义且无可用扩展方法
ASP.NET MVC "找不到定义且无可用扩展方法" 错误解决
问题场景
开发ASP.NET MVC应用时,出现“找不到定义且无可用扩展方法”的编译错误,无法正常获取数据库表数据并展示。相关代码如下:
1. 数据上下文模型 ProfileCreationContext
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.EntityFrameworkCore; using System.IO; using Microsoft.Data.SqlClient; using System.Data; namespace CRUD_Profile_Creation.Models { public class ProfileCreationContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = builder.Build(); optionsBuilder.UseSqlServer(configuration["ConnectionStrings:UserProfile"]); } SqlConnection con = new SqlConnection("Data Source=DESKTOP-HDBEK6R;Initial Catalog=Bottleneckv1;Integrated Security=True"); public DbSet<ProcessUnit> ProcessUnit { get; set; } } }
2. 实体模型 ProcessUnit
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace CRUD_Profile_Creation.Models { public class ProcessUnit { public string ProcessUnitID { get; set; } public string ProcessUnitName { get; set;} public int ProcessTypeID { get; set;} public string InventoryName { get; set;} public string CumM { get; set;} public string PerdayM { get; set;} public string TotalM { get; set; } } }
3. 错误的控制器代码 ProcessUnitController
using CRUD_Profile_Creation.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace CRUD_Profile_Creation.Controllers { public class ProcessUnitController : Controller { private ProfileCreationContext db = new ProfileCreationContext(); public IActionResult Index() { ViewBag.processUnitID = db.ProcessUnitID.ToList(); ViewBag.processUnitID = db.ProcessUnitName.ToList(); ViewBag.processUnitID = db.ProcessTypeID.ToList(); ViewBag.processUnitID = db.InventoryName.ToList(); ViewBag.processUnitID = db.CumM.ToList(); ViewBag.processUnitID = db.PerdayM.ToList(); ViewBag.processUnitID = db.TotalM.ToList(); return View(); } } }
错误原因
控制器代码存在两个核心问题:
- 属性访问错误:
ProfileCreationContext中仅定义了DbSet<ProcessUnit> ProcessUnit,并无ProcessUnitID、ProcessUnitName等直接属性,直接调用db.ProcessUnitID会触发“找不到定义”的错误。 - 逻辑赋值错误:多次将不同数据赋值给同一个
ViewBag.processUnitID,最终仅会保留最后一次赋值结果,完全不符合展示所有字段数据的需求。
修正后的控制器代码
正确做法是通过DbSet获取整个实体集合,再传递给视图。以下是修正后的示例代码(以DenoProfileController为例,可根据自身业务实体调整):
public class DenoProfileController : Controller { private ProfileCreationContext db = new ProfileCreationContext(); public IActionResult Index() { ViewBag.denoprofile = db.DenoProfile.ToList(); return View(); } }
若需展示ProcessUnit的数据,对应控制器代码应修改为:
public class ProcessUnitController : Controller { private ProfileCreationContext db = new ProfileCreationContext(); public IActionResult Index() { // 获取ProcessUnit表所有数据 var processUnits = db.ProcessUnit.ToList(); // 将集合传递给视图,也可通过ViewBag传递 return View(processUnits); } }
内容的提问来源于stack exchange,提问作者Illyiana Yusof
相关产品推荐
相关产品推荐

