Asp.net mvc MVC条件显示项

Asp.net mvc MVC条件显示项,asp.net-mvc,ninject,partial,Asp.net Mvc,Ninject,Partial,我有一个显示链接菜单的部分(用户控件)。它就在我的主页上。如果你是一个管理员,你应该看到一个不同于其他人的菜单 我的成员类中有一个名为:IsAdmin()的方法。通常情况下,如果某人是管理员,则很容易在部分声明中添加一些逻辑以显示右菜单,例如: <% if (member.IsAdmin()) { %> 但是,由于我使用Ninject进行依赖项注入,并且如果没有所需的依赖项(IMemberRepository),则无法实例化我的成员类,因此我不确定如何在我的部分代码中实现这一点

我有一个显示链接菜单的部分(用户控件)。它就在我的主页上。如果你是一个管理员,你应该看到一个不同于其他人的菜单

我的成员类中有一个名为:IsAdmin()的方法。通常情况下,如果某人是管理员,则很容易在部分声明中添加一些逻辑以显示右菜单,例如:

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


但是,由于我使用Ninject进行依赖项注入,并且如果没有所需的依赖项(IMemberRepository),则无法实例化我的成员类,因此我不确定如何在我的部分代码中实现这一点。我知道Ninject可以为我的控制器类的构造函数提供一个存储库,但我不知道如何部分地做到这一点。

在我看来,不应该使用注入,因为它很难通过单元测试进行测试。考虑更改设计,并让控制器更改视图模型,并使用视图模型来决定所显示的内容。 如果您确实想进行视图注入,MVC3示例应用程序中有一个示例:
我想出来了。在我的部分中,我加入了以下内容:

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

上周我也遇到了同样的困境,因为我有一个部分,提供了各种视图的“顶级位置”列表

确保向控制器注入必要的服务或存储库,以向分部提供所需的数据,然后将其作为动态viewdata属性(在mvc3中)传递给视图


或者,更正式地说,将其包含在控制器返回的视图模型中。

这远远不是一个好的解决方案。这只是一个非常难看的黑客程序,也是一个不使用Ninject的好例子。@Remo Gloor如果你能告诉我们如何不使用“难看的黑客程序”就可以了。很久以前我发布了一个答案,告诉我们如何使用Ninject。这和鲍迪的答案完全一样。不要在视图上使用依赖项注入。让您的控制器通过更改视图模型来做决定。这将起作用,除非我的母版页上存在此部分。但是我没有提到…所以我会给你分数。但请让我知道你认为你会怎么做,如果部分是在母版页(如果它将不同于我的解决方案)。如果部分是在我的母版页,我首先要考虑的是它是否会被实际使用在任何其他地方(像另一个母版页,或页不使用主)-如果答案是否定的,然后我会将其内容移动到母版页。有几种方法可以帮助您向母版页提供此处介绍的数据。。。
if (Request.IsAuthenticated && membershipService.IsAdmin()) 
{
       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);
        }