MVC условно отображает элементы

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

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

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

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


person Joe    schedule 13.04.2011    source источник


Ответы (3)


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

Убедитесь, что в контроллер введена необходимая служба или репозиторий, чтобы предоставить партиалу требуемые данные, а затем передать их представлению как свойство динамических данных представления (в 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);
        }

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

person Baldy    schedule 14.04.2011
comment
Это сработало бы, если бы этот фрагмент не существовал на моей главной странице. Однако я не упомянул об этом ... Итак, я награжу вас баллами. Но, пожалуйста, дайте мне знать, как вы думаете, что вы бы сделали это, если бы часть была на главной странице (если она будет отличаться от моего решения ниже). - person Joe; 14.04.2011
comment
если партиал размещался на моей главной странице, первое, что я бы рассмотрел, это будет ли он фактически использоваться где-либо еще (например, другая главная страница или страница, которая не использует мастер) - если ответ отрицательный, я бы переместил его содержимое на главную страницу. есть несколько подходов к тому, как вы можете предоставить главной странице данные, которые здесь описаны ... stackoverflow.com/questions/78548/ - person Baldy; 17.04.2011

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

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

person Remo Gloor    schedule 13.04.2011

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

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

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

if (Request.IsAuthenticated && membershipService.IsAdmin()) 
{
person Joe    schedule 13.04.2011
comment
Это далеко не лучшее решение. Просто очень уродливый хак и хороший пример того, как не использовать Ninject. - person Remo Gloor; 14.04.2011
comment
@Remo Gloor, возможно, это было бы полезно, если бы вы могли рассказать нам, как это сделать, не используя уродливый хак. - person Joe; 14.04.2011
comment
Я давно отправил ответ, рассказывающий, как это сделать. Это точно такой же ответ, что и у Лысого. Не используйте внедрение зависимостей в представлениях, пусть ваш контроллер сделает решение, изменив модель представления. - person Remo Gloor; 14.04.2011