Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在布局视图中访问UserProfile_Asp.net Mvc_Dependency Injection_Structuremap - Fatal编程技术网

Asp.net mvc 如何在布局视图中访问UserProfile

Asp.net mvc 如何在布局视图中访问UserProfile,asp.net-mvc,dependency-injection,structuremap,Asp.net Mvc,Dependency Injection,Structuremap,在我的MVC应用程序中,我有一个共享的_Layout.cshtml文件,它为用户显示菜单 在该视图中,我希望显示UserProfile实体中的信息,该实体使用SimpleMembership创建,因此链接到IPrincipal用户,可以在_布局页面中直接访问该用户 因此,我编写了一个扩展方法,对我的UnitOfWork进行调用,如下所示: public static UserProfile GetUserProfile(this IPrincipal u) { I

在我的MVC应用程序中,我有一个共享的_Layout.cshtml文件,它为用户显示菜单

在该视图中,我希望显示UserProfile实体中的信息,该实体使用SimpleMembership创建,因此链接到IPrincipal用户,可以在_布局页面中直接访问该用户

因此,我编写了一个扩展方法,对我的UnitOfWork进行调用,如下所示:

    public static UserProfile GetUserProfile(this IPrincipal u)
    {
        IUnitOfWork uow = new UnitOfWork();
        return uow.UserRepository.GetUserProfile(u);            
    }
public class BaseController : Controller
{
    // NOT NECESSARY TO DISPOSE THE UOW IN OUR CONTROLLERS
    // Recall that we let IoC inject the Uow into our controllers
    // We can depend upon on IoC to dispose the UoW for us
    protected MvcApplication.Data.Contracts.IUnitOfWork _Uow { get; set; }
}
现在这是可行的,但闻起来并不好,因为我正在实例化UnitOfWork,而不是注入它

我有一个BaseController类,如下所示:

    public static UserProfile GetUserProfile(this IPrincipal u)
    {
        IUnitOfWork uow = new UnitOfWork();
        return uow.UserRepository.GetUserProfile(u);            
    }
public class BaseController : Controller
{
    // NOT NECESSARY TO DISPOSE THE UOW IN OUR CONTROLLERS
    // Recall that we let IoC inject the Uow into our controllers
    // We can depend upon on IoC to dispose the UoW for us
    protected MvcApplication.Data.Contracts.IUnitOfWork _Uow { get; set; }
}
(我的一些代码基于以下答案:)

我使用Package Manager安装StructureMap,此代码在应用程序启动时运行:

public static class StructuremapMvc
{
    public static void Start()
    {
        IContainer container = IoC.Initialize();
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
    }
}
据我所知,这将我的具体UnitOfWork类注入到我的控制器中,并处理UnitOfWork的处理


不幸的是,这是我对国际奥委会的理解,如果我想从控制器以外的地方访问UnitOfWork,或者我是否可以从控制器将信息传递到_布局,我不确定该怎么办。我想在_布局页面上获取数据,但我不知道如何从那里访问UnitOfWork,或者如何将UnitOfWork注入扩展方法

将数据放入ViewBag中,然后让_布局视图从那里将其拉出来

您可以将其放入
BaseController

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    var u = requestContext.HttpContext.User;
    var data = _UoW.UserRepository.GetUserProfile(u);

    ViewBag.UserData = data;
}
并在布局视图中渲染数据:

@ViewBag.UserData 

我已经使用Html.Action来呈现部分视图()解决了这个问题,但我觉得这是一个更好的方法。