C# 关于在asp.net mvc 5中将数据从控制器传递到布局子视图的进一步说明

C# 关于在asp.net mvc 5中将数据从控制器传递到布局子视图的进一步说明,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我想我有一个相当标准的问题,因为我想将某些数据从asp.NETMVC5控制器传递到共享视图,在我的例子中是导航 我有一个在导航共享视图中显示username和userpicture的模板,所以我需要将相应的数据传递给它 我的布局结构: public abstract class ViewModelBase { public HeaderViewModel Header {get;} public NavigationViewModel Navigation {get;}

我想我有一个相当标准的问题,因为我想将某些数据从asp.NETMVC5控制器传递到共享视图,在我的例子中是导航

我有一个在导航共享视图中显示username和userpicture的模板,所以我需要将相应的数据传递给它

我的布局结构:

public abstract class ViewModelBase {
    public HeaderViewModel Header {get;}
    public NavigationViewModel Navigation {get;}
    public FooterViewModel Footer {get;}

    public ViewModelBase(HeaderViewModel header, NavigationViewModel navigation, FooterViewModel footer) {
        Header = header;
        Navigation = navigation;
        Footer = footer;
    }
}

public class HeaderViewModel {
    // properties

    public HeaderViewModel(...) {
    }
}

public class NavigationViewModel {
    // properties

    public NavigationViewModel(...) {
    }
}

public class FooterViewModel {
    // properties

    public FooterViewModel(...) {
    }
}
  • 共享\布局
  • 共享\头
  • 共享\导航
  • %主体%
  • 共享\Footer
其中布局是主视图,当然我还有其他视图,如Home\Index。 可以想象,除了登录/注册或任何错误视图之外,我必须在每个视图中显示用户名和他的userpicture。 这些视图根本不使用布局,因此每次使用布局结构渲染视图时,用户都已登录

因此,我正在研究将数据从我的控制器传递到导航视图的方法,尽管我的控制器返回索引视图,并希望在我的用例中澄清它们的缺点和有效选择:

用例:

我的项目有一个用户可以访问的相当愚蠢的MVC应用程序。一旦他登录到MVC应用程序,就会根据用户从中获取数据的同一webapi对用户进行身份验证,并存储访问令牌以及其他用户详细信息,以备进一步请求。我还不确定把这些数据存储在哪里。据我所知,选项将是Cookies、会话和本地存储。 由于我不熟悉asp.net、MVC和C,所以我还没有弄清楚如何在MVC应用程序中使用[Authorize]属性,以便将用户标记为已验证用户:/ 我想关键问题是MVC应用程序无法访问数据库,因此无法检查登录和填充用户身份

如何将数据从控制器传输到视图:

ViewBag:向视图传递数据的最简单方法。它不是强类型的,可以在所有视图中访问。我被告知使用它是一种不好的做法,并被建议使用viewModels

ViewData:似乎与ViewData有点相同

ViewModel:传递给视图并需要在使用它的任何视图中声明的强类型模型。因此,如果我想在导航视图中使用它,我需要在那里声明它。这种方法的最大缺点是,每个viewmodel都需要有一种baseViewModel,这样它们就有了一个通用的结构,这显然会在以后的过程中导致问题,也会阻止我继承其他模型来填充viewmodel结构

Cookie:显然,我可以在登录期间将数据存储在Cookie中,然后在视图中访问它们,但是Cookie必须在那里,这样我就无法将此信息保存在会话或本地存储中

会话:我也可以在会话中存储数据,但当用户关闭浏览器选项卡时,会话将过期

LocalStorage:这对我来说是非常新的,所以我无法判断

用户标识:我刚刚发现我还可以从Context.User.Identity访问用户标识

全局过滤器,如[Authorize]属性或自定义过滤器:如果我理解正确,使用全局过滤器,我可以在每个控制器操作中自动填充所需数据,并排除登录/注册等不需要的数据。由于我的项目结构,我还不确定如何应用这种方法(见上文)

RenderAction:我还可以通过RenderAction助手方法调用另一个控制器方法来始终呈现页面的该部分

你们怎么解决这个问题? 如果您需要更多的澄清,请询问


谢谢:)

使用基本视图模型。您仍然可以使用继承来构建视图模型中的功能,正如您所说,它们将共享一个公共的基本视图模型

我不确定您在使用这种方法时会遇到什么问题,但我建议,强类型、可维护的视图模型的好处会超过这些问题,它可以被您的所有视图使用,包括局部视图和
\u布局

建议您根据布局结构开始:

public abstract class ViewModelBase {
    public HeaderViewModel Header {get;}
    public NavigationViewModel Navigation {get;}
    public FooterViewModel Footer {get;}

    public ViewModelBase(HeaderViewModel header, NavigationViewModel navigation, FooterViewModel footer) {
        Header = header;
        Navigation = navigation;
        Footer = footer;
    }
}

public class HeaderViewModel {
    // properties

    public HeaderViewModel(...) {
    }
}

public class NavigationViewModel {
    // properties

    public NavigationViewModel(...) {
    }
}

public class FooterViewModel {
    // properties

    public FooterViewModel(...) {
    }
}