1

以下のコードを参照してください。EFデータベースの最初のアプローチを使用し、DI用にNinjectを実装してドロップダウンを作成しようとしています。私はこれらの概念に不慣れで、何が間違っているのかわかりません。どんな助けでも大歓迎です-ありがとう。

以下は私のエラーです:

タイプ '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 フォルダーの下に、以下の 3 つのクラス (CityDTO、MyViewModel、MyModel) があります。

CityDTO.cs

  public class CityDTO
    {
        public string CityId { get; set; }
        public string CityName { get; set; }

    }

MyViewModel.cs

public class MyViewModel
{
    public string SelectedCityId { get; set; }
    public IEnumerable<SelectListItem> Cities { get; set; }
}

MyModel.cs

public interface ICitiesRepository
{
    IEnumerable<City> GetAll();
}

public class CitiesRepositoryEF: ICitiesRepository
    {
        public IEnumerable<City> GetAll()
        {
            using (var ctx = new LocationEntities())
            {
                return ctx.usp_GetAllCities().ToList();
            }
        }
    }

GlobalAsax.cs

 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);
        }

App_Start/NinjectWebCommon.cs

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<Models.ICitiesRepository>().To<Models.CitiesRepositoryEF>();
        }  

そして以下は私の見解です:

@model TestApp.Models.MyViewModel

@using (Html.BeginForm())
{ 
@Html.DropDownListFor(x=>x.SelectedCityID, Model.Cities, "Select City")
<button type = "submit">OK</button>
}
4

2 に答える 2

0
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)
        }
    }
}

I think somehow the result of usp_GetAllCities() is is not reeturning a generic list (IEnumerable or whatever) of the same type (City). You should look into what the usp returns and make sure it's the same as what your GetAll() method wants to return.

But I'm not sure how EF handles the stored procedures and what is defined in your edmx and all, but it has to do with that mismatch.

于 2013-02-07T07:07:13.810 に答える
0

メソッドの署名は、IEnumerable を返したいと言っていますが、List を返しています。メソッドを次のように微調整するだけです。

    public List<City> GetAll()
    {
        using (var ctx = new LocationEntities())
        {
            return ctx.usp_GetAllCities().ToList();  
        }
    }

そうすれば、アクションで ToList() を呼び出す必要がなくなります。

model.Cities = this
        .repository
        .GetAll()
        //.ToList()  <-- delete this
        .Select(x => new SelectListItem
        {
            Value = x.Id.ToString(),
            Text = x.Name
        });

それが役立つことを願っています

于 2013-01-18T09:53:23.690 に答える