在每个视图中包含用户模型

2024-01-09

我正在创建一个具有表单身份验证的 ASP.NET MVC4 网站,但在以正确的方式在视图中包含多个模型时遇到了困难。

具体来说,有一个属于给定视图的模型,例如“CartModel”。但是,考虑到站点的当前 UI,部分视图中使用了一个模型,该模型包含在主布局视图中,其中包含有关当前登录用户的信息。

我当前解决此问题的方法是将 LoginModel 作为每个视图模型的一部分。然而,这似乎是重复的并且不能正常工作。

解决此类问题的最正确方法是什么?


有两种方法可以使其可访问。

  1. 使用过滤器(或覆盖OnActionExecuting您的控制器都派生自的基本控制器中的方法)添加您需要的模型ViewBag/ViewData.
  2. 使用自己的基地WebViewPage https://stackoverflow.com/questions/14358410/changing-base-view-type-on-mvc4公开模型,但您仍然需要填充它。因此,它可能需要访问您的 API,并且正确完成,可能需要一些依赖项注入。

方法一:OnActionExecuting

从基本控制器覆盖

public abstract MyBaseController : Controller
{
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
             if (User != null && User.Identity.IsAuthenticated) // check if user is logged in if you need to
             {
                  ViewBag.LoginModel = /* add data here */;
             }
        }
}

然后将其用作基类(或继承中更靠前的位置):

public MyController : MyBaseController
{
   //etc.
}

或者使用过滤器

PopulateLoginModelAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.User != null && filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
             filterContext.Controller.ViewBag.LoginModel = /* add data here */;
        }

        this.OnActionExecuting(filterContext);
    }
}

然后装饰控制器类、操作方法或添加为全局过滤器。

[PopulateLoginModel] // will be applied to all actions in this controller
public class MyController : Controller // note you can use the normal base type, or whatever you need
{
    public ActionResult MyView()
    {
        return View(new CartModel());
    }
}

然后使用您放置在中的模型ViewBag在引用的部分、布局等中,但继续使用Model对于操作的视图。

访问ViewBag通常在您的视图中(也可以通过布局访问,我在 LoginModel 类型上编写了一个属性值来说明):

<span>@ViewBag.LoginModel.Name</span> <!-- available because of the filter !-->
Number of items in your cart: @Model.Items.Count <!-- the model provided by the action method !-->

ViewBag.LoginModel将可用于从此控制器派生的所有操作,无需额外工作。我建议将其设为一个属性,因为它将为您提供基类以及要将其应用到的控制器/操作的更大灵活性。

方法2:提供自己的WebViewPage基类

您不太可能想要使用自己的 WebPageView 基类。如果您想添加成员来协助处理数据或视图的任何内容,那么这非常适合。但这不是添加或以其他方式操作视图数据或模型的正确位置,尽管这是可能的。

创建视图基类

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    protected LoginModel GetLoginModel()
    {
        // you could resolve some dependency here if you need to
        return /* add data here */
    }
}

然后在视图、局部视图和布局中使用成员

确保视图文件夹中的 web.config 已正确更新。

<span>@GetLoginModel().Name</span>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在每个视图中包含用户模型 的相关文章

  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 如何使用实体框架设置连接字符串

    我将 EF6 与 MySQL 结合使用 并有一个用于多个数据库的模型 我希望能够在我的表单中设置连接设置 如何以编程方式设置模型的连接字符串 你应该使用EntityConnectionFactory这就是您所需要的 public strin
  • 保护 ASP.NET MVC 应用程序中的 ajax 调用的安全

    我有一个基于 ASP NET MVC 的应用程序 它允许根据用户进行不同级别的访问 当前的工作方式是 当用户访问页面时 会根据数据库进行检查以确定用户拥有的权限 然后根据用户拥有的访问级别选择视图 有些用户比其他用户看到更多数据并拥有更多可
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • 重定向到其他控制器中的操作

    我想从一个控制器中的操作重定向到第二个控制器中的操作 通常我会使用 RedirectToAction actionName controllerName objects 我想要重定向到的方法有两个重载 一个用于 HttpVerbs Get
  • 在 MVC4 中使函数异步时 HttpContext.Current null

    我目前正在 VS2010 SP1 中开发 MVC4 我做了其中一个功能 控制器类异步 作为其中的一部分 我制作了控制器类 派生自 AsyncController 并添加了以下两个方法 参见代码部分 1 和 2 下 一种以 Async 结尾的

随机推荐

  • 如何使用 Python 测试 Selenium 中的警报/弹出窗口

    我被自动化困住了 当我输入错误的用户名和密码时 它会弹出 无法登录 尝试不同的用户名 def test logonWrongUserName self self setUpClass Initialize the driver self s
  • 如何在 git 中自动生成版本字符串[重复]

    这个问题在这里已经有答案了 可能的重复 为 Git 存储库启用 ident 字符串 https stackoverflow com questions 1792838 enable ident string for git repos 在我
  • UIRefreshControl在UITableView iOS6的底部?

    是否可以添加UIRefreshControl在底部UITableView 我会用它来加载更多数据 请问 有什么建议吗 我相信这个问题不会有任何简单的解决方案 也许有人可以编写一个单独的库来实现此行为 而且一旦您在表视图中缓存数据 它会导致更
  • 设置对象 nil 与release+realloc

    这不是垃圾收集环境 我有一个类实例变量 在运行时的某个时刻 我需要使用与最初构造时不同的数据集重新初始化 假设地说 如果我有一个NSMutableArray or an NSMutableDictionary 做这样的事情会更有效率吗 my
  • 在 MVC 应用程序中使用 ELMAH 调试/跟踪消息

    我们如何在 MVC 应用程序中使用 ELMAH 添加调试 跟踪消息 ELMAH 通常用于报告异常 而不是作为一般的调试 跟踪日志 对于调试 跟踪日志记录 我建议结合使用log4net https stackoverflow com ques
  • 在 Redhat 5 上运行 JavaFX 应用程序

    From my 上一个问题 https stackoverflow com questions 24420651 javafx helloworld jar cannot be ran on different platform 我知道Re
  • Azure 服务总线空闲时自动删除

    我试图找出设置 AutoDeleteOnIdle 时的正确行为 我有一个名为 MyGameMessages 的主题 不透露游戏名称 因为它可能被视为广告 我所做的是在服务器场中的每个节点上创建一个订阅 var manager GetName
  • 活动模型序列化器:nil:NilClass 的未定义方法“url_for”

    我在用着active model serializersgem 在我的应用程序中发送高级 json 响应 它实际上工作正常 但由于我安装了该 gem 使用几分钟后 应用程序崩溃 显示上面的错误 不确定我的代码是否与之相关 但不知何故 我也需
  • 如何使用Java测量网络响应时间?

    我们有一个客户端和一个服务器 我想测量它们之间网络的响应时间 当我向服务器发送请求时 它应该立即响应我的请求 它应该像 ping 请求一样 以便服务器不会有处理时间 我怎样才能在Java中做到这一点 我通过从客户端向服务器发送带有时间戳的数
  • 控制文件下载

    我正在使用 TWebBrowser 为我的程序构建一个更新程序 OnCreate 时 TWebBrowser 导航到给定的 URL 要下载更新 用户需要单击链接 单击链接时会出现此弹出窗口 所以我想知道是否可以 绕过该弹出窗口并允许自动下载
  • JQueryMobile 自动完成点击条目不更改输入值

    我尝试使用 jquery mobile 进行自动完成输入 所以我在这里找到了一个演示 http demos jquerymobile com 1 4 0 listview autocomplete remote http demos jqu
  • Java静态导入导致编译错误。可能是编译器错误?

    这在 Eclipse JDT 中可以正常编译 但在 1 6 30 或 1 7 25 上则不行 package doh import static doh Wtf InnerClass innerclassMethod import java
  • SQL Server 级联

    我正在制作一个网站 用户可以在其中发布 帖子 然后用户可以对这些帖子进行 评论 我有一个包含 3 个表的数据库 一项包含用户信息 一项包含帖子信息 最后一项包含评论信息 我想设置规则 以便如果用户被删除 他们的所有帖子和评论都会被删除 如果
  • Vue 使用 select、v-for 和 v-model 预选值

    我在用着select with v model并有选项v for和对象作为值 选项是一些由id标识的元素 如何根据自定义相等性预先选择选项 在本例中为相等 id场地 我正在寻找类似于 angularjs 的东西track by from n
  • 在多级继承中从子类调用“大”父函数[重复]

    这个问题在这里已经有答案了 public class GrandParent public void walk public class Parent public void walk public class Child public v
  • JavaFX 中的样式文本?

    我正在将聊天客户端从 Swing 切换到 JavaFX 但遇到了图形问题 以前 我使用的是JTextPane插入样式文本 但切换到 FX 后 我找不到能够执行所需操作的单个组件JTextPane做了 并且从this https stacko
  • 在对话框中启用 GPS 后 Android 位置返回 null

    当我进入屏幕时 我会检查 GPS 是否已打开 如果未打开 则会显示启用 GPS 的对话框 当用户单击 是 时 onActivityResult gt GPS 已打开 我尝试获取位置 但始终返回 null 当我在 GPS 已打开的情况下进入屏
  • 意外标记“(”与 mv !(build) 附近出现语法错误

    我正在尝试使用 Jenkins 构建过程运行以下 shell 命令 mv build build 现在构建失败了 bin bash xe tmp jenkins2925091423898519645 sh tmp jenkins292509
  • 如何使用Pandoc图像对齐来对齐同一行中的两个图像?

    从 pandoc 文档我知道如何插入图像 http johnmacfarlane net pandoc README html images http johnmacfarlane net pandoc README html images
  • 在每个视图中包含用户模型

    我正在创建一个具有表单身份验证的 ASP NET MVC4 网站 但在以正确的方式在视图中包含多个模型时遇到了困难 具体来说 有一个属于给定视图的模型 例如 CartModel 但是 考虑到站点的当前 UI 部分视图中使用了一个模型 该模型