Asp.net mvc 创建下拉列表时出错-ASP.NET MVC 4使用EF数据库优先方法-为DI实现Ninject
请参阅下面的代码。我试图通过使用EF数据库优先方法创建一个下拉列表,并为DI实现Ninject。我不熟悉这些概念,我不知道我做错了什么。任何帮助都将不胜感激-谢谢 下面是我的错误:Asp.net mvc 创建下拉列表时出错-ASP.NET MVC 4使用EF数据库优先方法-为DI实现Ninject,asp.net-mvc,entity-framework,dependency-injection,ninject,Asp.net Mvc,Entity Framework,Dependency Injection,Ninject,请参阅下面的代码。我试图通过使用EF数据库优先方法创建一个下拉列表,并为DI实现Ninject。我不熟悉这些概念,我不知道我做错了什么。任何帮助都将不胜感激-谢谢 下面是我的错误: @model TestApp.Models.MyViewModel @using (Html.BeginForm()) { @Html.DropDownListFor(x=>x.SelectedCityID, Model.Cities, "Select City") <button type = "s
@model TestApp.Models.MyViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x=>x.SelectedCityID, Model.Cities, "Select City")
<button type = "submit">OK</button>
}
无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.IEnumerable”
下面是我的控制器
public class CitiesController: Controller
{
private readonly ICitiesRepository repository;
public CitiesController(ICitiesRepository repository)
{
this.repository = repository;
}
public ActionResult Index()
{
var model = new Models.MyViewModel();
model.Cities = this
.repository
.GetAll()
.ToList()
.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks for selecting city: " + model.SelectedCityId);
}
}
我在Models文件夹下有以下三个类(CityDTO、MyViewModel、MyModel)。
CityDTO.cs
public class CityDTO
{
public string CityId { get; set; }
public string CityName { get; set; }
}
public class MyViewModel
{
public string SelectedCityId { get; set; }
public IEnumerable<SelectListItem> Cities { get; set; }
}
public interface ICitiesRepository
{
IEnumerable<City> GetAll();
}
public class CitiesRepositoryEF: ICitiesRepository
{
public IEnumerable<City> GetAll()
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList();
}
}
}
protected void Application_Start()
{
App_Start.NinjectWebCommon.Start();
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<Models.ICitiesRepository>().To<Models.CitiesRepositoryEF>();
}
MyViewModel.cs
public class CityDTO
{
public string CityId { get; set; }
public string CityName { get; set; }
}
public class MyViewModel
{
public string SelectedCityId { get; set; }
public IEnumerable<SelectListItem> Cities { get; set; }
}
public interface ICitiesRepository
{
IEnumerable<City> GetAll();
}
public class CitiesRepositoryEF: ICitiesRepository
{
public IEnumerable<City> GetAll()
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList();
}
}
}
protected void Application_Start()
{
App_Start.NinjectWebCommon.Start();
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<Models.ICitiesRepository>().To<Models.CitiesRepositoryEF>();
}
应用程序启动/NinjectWebCommon.cs
public class CityDTO
{
public string CityId { get; set; }
public string CityName { get; set; }
}
public class MyViewModel
{
public string SelectedCityId { get; set; }
public IEnumerable<SelectListItem> Cities { get; set; }
}
public interface ICitiesRepository
{
IEnumerable<City> GetAll();
}
public class CitiesRepositoryEF: ICitiesRepository
{
public IEnumerable<City> GetAll()
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList();
}
}
}
protected void Application_Start()
{
App_Start.NinjectWebCommon.Start();
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<Models.ICitiesRepository>().To<Models.CitiesRepositoryEF>();
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}
下面是我的观点:
@model TestApp.Models.MyViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x=>x.SelectedCityID, Model.Cities, "Select City")
<button type = "submit">OK</button>
}
@model TestApp.Models.MyViewModel
@使用(Html.BeginForm())
{
@Html.DropDownListFor(x=>x.SelectedCityID,Model.Cities,“选择城市”)
好啊
}
您的方法签名说它想返回IEnumerable,但您正在返回List。就这样仔细看看你的方法吧:
public List<City> GetAll()
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList();
}
}
public List GetAll()
{
使用(var ctx=new LocationEntities())
{
返回ctx.usp_GetAllCities().ToList();
}
}
这样,您就不必再在操作中调用ToList()
model.Cities = this
.repository
.GetAll()
//.ToList() <-- delete this
.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
model.Cities=此
.储存库
.GetAll()
//.ToList()新建SelectListItem
{
Value=x.Id.ToString(),
Text=x.名称
});
希望这能对公共类城市存储库有所帮助
public class CitiesRepositoryEF: ICitiesRepository
{
public IEnumerable<City> GetAll() // <-- Generic of type City
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList(); // <-- Generic of type (result of usp_GetAllCities)
}
}
}
{
public IEnumerable GetAll()//何时出现错误?当我尝试编译Mymodel.cs“无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.IEnumerable'”时,出现以下错误。能否显示usp_GetAllCities()的代码?感谢您的回复。我已更改了您提到的代码,但仍然出现以下错误。“无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”。我是否必须在从数据库获取存储过程的.edmx文件的模型浏览器中进行任何更改?-谢谢,我的存储过程的名称是usp_GetAllCities()。我在模型浏览器中创建了一个复杂类型,并将其命名为usp_GetAllCities_Result。