2016-01-12 2 views
1

Я получаю эту странную ошибку: MissingMethodException: Невозможно создать экземпляр интерфейса.Пытается отобразить простой Просмотреть список всех строк MVC 6

Я поставил свои объекты как можно проще, просто пытаясь понять, что работает с этим управлением ролями.

Приложение MVC 6 работает для регистрации и входа для одиноких пользователей. Я могу даже создавать роли и назначать их при запуске. Но любая попытка сделать что-либо еще мне мешала. Я просто пытаюсь отобразить список ролей.

Контроллер:

namespace MVC6.Controllers 
{ 

    //[Authorize(Roles = Utilities.Security.AdminRole)] 
    public class RolesManagementController : Controller 
    { 

     // GET: /RolesManagement/ 

     public ActionResult Index(IServiceProvider serviceProvider) 
     { 
      var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>(); 
      var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>(); 

      return View(RoleManager.Roles.ToList()); 

     } 

Простой индекс Вид:

@model List<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> 



@{ 
    ViewBag.Title = "Roles"; 
} 


<h2>@ViewBag.Title</h2> 

<br /><br /> 

<fieldset> 
    <table id="roles" class="display"> 

     <thead> 
      <tr> 
       <th width="20%">Role Name</th> 
       <th width="20%">Action</th> 
      </tr> 
     </thead> 
     <tbody> 
      @if (null != Model) 
      { 
       foreach (var role in Model) 
       { 
        <tr> 
         <td> 
          @role.Name 
         </td> 
         <td> 

         </td> 
        </tr> 
       } 
      } 
     </tbody> 
    </table> 
</fieldset> 

Я запустить приложение в отлаживать с точкой излома внутри от ActionResult, просто чтобы посмотреть, и он никогда не попадает в точку останова и возвращает эту ошибку:

MissingMethodException: Невозможно создать экземпляр интерфейса.

Я ничего не получаю, пустой, нада, когда я набираю «http://localhost:61849/RolesManagement» в URL-адресе.

ответ

2

Всякий раз, когда вы хотите ввести зависимость напрямую в метод действия, вам необходимо использовать атрибут [FromServices]. Проверьте asp docs:

Sometimes you don’t need a service for more than one action within your controller. In this case, it may make sense to inject the service as a parameter to the action method. This is done by marking the parameter with the attribute [FromServices]

Так что ваш код будет выглядеть следующим образом:

public ActionResult Index([FromServices]IServiceProvider serviceProvider) 
{ 
    var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>(); 
    var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>(); 
    return View(RoleManager.Roles.ToList()); 
} 

Вы также можете изменить свой контроллер, так эта зависимость представлена ​​в конструкторе (В этом случае вам не нужно атрибут). Это было бы чище ИМХО.

+0

«Эти зависимости предоставляются в конструкторе». , , не знаю, где это. Вроде бы новое. Ваш [FromServices] - отличная идея. Я выяснил, что мне пришлось переопределить настройки конфигурации в Startup.cs, чтобы заставить строку подключения работать. Я принимаю ваш ответ. – JustJohn

+0

Я бы предложил взглянуть на [docs] (http://docs.asp.net/projects/mvc/en/latest/controllers/dependency-injection.html#dependency-injection-and-controllers), где представляет собой приятное и простое введение в конструкторскую инъекцию с использованием контроллеров ASP 5 и MVC 6. –

+0

Да. Спасибо. Я вижу больше каждый день. – JustJohn

Смежные вопросы