MVC условно отображает элементы - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть частичная (пользовательский контроль), которая показывает меню ссылок.Он живет на моей главной странице.Если вы администратор, вы должны увидеть меню, отличное от других.

В моем классе Member есть метод, который называется: IsAdmin ().Обычно было бы очень легко просто поместить некоторую логику в декларативное представление, чтобы показать правильное меню, если кто-то является администратором, например:

<% if (member.IsAdmin()) { %>

Но так как я использую Ninject для внедрения зависимостей и мой членКласс не может быть создан без обязательных зависимостей (IMemberRepository). Я не уверен, как это сделать в моей части.Я знаю, что Ninject может предоставить репозиторий для конструктора моего класса Controller, но я не знаю, как сделать это частично.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

По моему мнению, инъекция не должна использоваться вообще, потому что она вряд ли может быть проверена модульными тестами. Подумайте об изменении дизайна и позвольте контроллеру вместо этого изменить модель представления и используйте модель представления, чтобы решить, что показано.

Если вы действительно хотите внедрить представление, в примере приложения MVC3 есть пример: https://github.com/ninject/ninject.web.mvc/tree/master/mvc3/src/SampleApplication/Views/Math

0 голосов
/ 14 апреля 2011

Я был в том же затруднительном положении на прошлой неделе, так как у меня есть часть, которая предоставляет список «лучших мест» для различных представлений.

Убедитесь, что в контроллер введена необходимая служба или хранилище для предоставления частичке требуемых данных, а затем передайте ее представлению в виде свойства динамического представления (в mvc3) ...

       public class LocationController : Controller
    {
        private readonly ILocationService _svc;

        public LocationController(LocationService svc)
        {
                _svc = svc;
        }

        public ActionResult Index()
        {
            //get data for 'top locations' partial
            var topOnes = svc.GetTopLocations(10);
            ViewData.TopLocations = topOnes;
            //mvc2 would be ViewData["TopLocations"] = topOnes;

            //get 'main' view data
            var location  = svc.GetDefaultLocation();
            return View(location);
        }

Или, более формально, включить его в модель представления, которую возвращает ваш контроллер.

0 голосов
/ 14 апреля 2011

Я понял это. В своей части я вставил следующее:

IKernel kernel = new StandardKernel(new NinjectControllerFactory.MyServices());
MembershipService membershipService = new MembershipService(kernel.Get<IMemberRepository>());

А теперь я могу сделать следующее:

if (Request.IsAuthenticated && membershipService.IsAdmin()) 
{
...