繁体   English   中英

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

[英]further clarification about passing data from controller to layout sub view in asp.net mvc 5

我想我有一个非常标准的问题,因为我想将某些数据从asp.net MVC 5控制器传递到共享视图(在我的情况下为导航)。

我有一个模板,在导航共享视图中显示用户名和用户图片,因此需要将各自的数据传递给它。

我的布局结构:

  • 共享\\布局
  • 共享\\部首
  • 共享\\导航
  • %身体%
  • 共享\\页脚

布局是主视图,当然,我还有其他视图,例如Home \\ Index。 您可以想象,除了登录/注册或任何错误视图外,我必须在每个视图中显示用户名及其用户图片。 这些视图完全不使用布局,因此,每次使用布局结构呈现视图时,用户都已经登录。

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

用例:

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

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

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

ViewData:似乎和viewdata一样。

ViewModel:传递给视图的强类型模型,需要在使用它的任何视图中声明。 因此,如果要在导航视图中使用它,则需要在此声明它。 这种方法的最大缺点是,每个视图模型都需要具有一个baseViewModel,因此它们具有共同的结构,这种结构显然会在以后引起问题,并阻止我继承其他模型来填充我的viewModelStructure。

Cookies:很明显,我可以在登录期间将数据存储在cookie中,然后在视图中访问它们,但是cookie必须存在,因此我将无法将该信息保存在会话或本地存储中

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

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

用户身份:我刚刚发现我还可以从Context.User.Identity访问用户身份。

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

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

你们如何解决这个问题? 如果您需要更多说明,请询问。

谢谢 :)

使用基本的ViewModel。 您仍然可以使用继承在视图模型中构建功能,就像您所说的那样,它们都将共享一个通用的基本视图模型。

我不确定使用此方法会遇到什么问题,但我建议使用强类型化,可维护的视图模型的好处来弥补这些问题,这些模型可用于所有视图,包括部分视图和_Layout

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

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(...) {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM