Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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
C# 在_LoginPartial中查看数据_C#_Asp.net Core_Viewdata - Fatal编程技术网

C# 在_LoginPartial中查看数据

C# 在_LoginPartial中查看数据,c#,asp.net-core,viewdata,C#,Asp.net Core,Viewdata,我已经创建了ASP.NET核心应用程序,现在我正在尝试在_LoginPartial中使用ViewBag。我已创建基本控制器: public class BaseController : Controller { public ApplicationDbContext _db; public BaseController(ApplicationDbContext db) { _db = db; ViewData["MyKey"] = _db

我已经创建了ASP.NET核心应用程序,现在我正在尝试在_LoginPartial中使用ViewBag。我已创建基本控制器:

public class BaseController : Controller
{
    public ApplicationDbContext _db;

    public BaseController(ApplicationDbContext db)
    {
        _db = db;
        ViewData["MyKey"] = _db.MyTable.ToList();
    }
}
我的所有控制器都源自此BaseController

但当我在_LoginPartial.cshtml中看到ViewData时,我只能看到它包含默认键=标题,值=主页。我应该如何使我的密钥在_LoginPartial中可用


谢谢

问题是您试图在控制器的构造函数中设置
ViewData
内容

ViewData
字典实际上不是由控制器创建的。它在MVC管道中的一个非常不同的点上创建,然后被注入控制器。您基本上可以将此过程视为如下所示:

// create controller
var controller = CreateController<MyController>();

// do stuff

// inject ViewData
controller.ViewData = GetViewDataDictionary();

// invoke controller action
var result = controller.SomeAction();
//创建控制器
var controller=CreateController();
//做事
//注入视图数据
controller.ViewData=GetViewDataDictionary();
//调用控制器操作
var result=controller.SomeAction();
因此,在创建控制器后,将提供
ViewData
;在它的构造函数运行之后。因此,构造函数中对视图数据的任何赋值都不会应用于实际的视图数据字典

因此,您需要在不同的时间设置这些值,您不能在那里使用构造函数。一般来说,使用
ViewData
是一种遗留构造,如果可能的话,应该尽量避免。相反,您应该使用强类型视图模型对象。当然,这将要求您在每个操作中显式地传递数据,但这样也不会引入任何隐式数据流


另一种方法是使用视图组件,如果您所做的操作实际上始终应用于
\u LoginPartial
,则该方法尤其有用。是可在视图内部使用的可重用组件,其行为类似于控制器操作。因此,您可以将一个视图组件插入到您的分部中,并让分部运行逻辑(甚至异步!)以从数据库中提供数据。而且,您无需干扰任何控制器即可使其正常工作。

ViewData
可以在激活控制器后访问,也可以通过过度绑定
OnActionExecuting
来访问

对于解决方案,您可以尝试覆盖
OnActionExecuting
,如下所示:

public class BaseController : Controller
{
    public ApplicationDbContext _db;

    public BaseController(ApplicationDbContext db)
    {
        _db = db;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        ViewData["MyKey"] = _db.Product.ToList();
        base.OnActionExecuting(context);
    }

}
\u LoginPartial.cshtml

@foreach (Product item in @ViewData["MyKey"] as IList<Product>)
{
    <li><a>@item.Name</a></li>
}
@foreach(作为IList的@ViewData[“MyKey”]中的产品项)
{
  • @项目名称
  • }
    这是不可能的。您确定要继承
    BaseController
    ?如果这样做会怎么样:
    ViewData[“MyKey”]=“testpasses”
    ,这样做有效吗?我的控制器称为BaseController。我从控制器继承它。我所有的控制器都继承自BaseController。当我在视图中设置断点并将鼠标悬停在_LoginPartial中的ViewData上时,我看不到MyKey键,只看到Title键。当我尝试使用您建议的简单方法(将字符串指定给键)时,结果是一样的-我无法在ViewData中看到它。不,这是不可能的。创建另一个项目并进行相同的测试,您将100%看到它。这是另一个问题。正如你所建议的,我已经创建了一个新项目,并且看到了相同的问题。我使用构造函数“public BaseController(){ViewData[“MyKey”]=“testpasses”;}”创建“BaseController:Controller”。我从BaseController中删除Index()方法。然后我更改HomeController,使其从BaseController继承。在_LoginPartial中,我写了“
  • @ViewBag[“MyKey”]
  • ”。我在那个里设置了断点,只在ViewData中看到{[Title,HomePage]}。我一定是做错了什么,但我不知道是什么。与其试图弄明白为什么这不起作用,不如干脆把它完全扔掉。这是一个非常糟糕的主意。您正在创建控制器和视图之间的紧密耦合(bad),在控制器构造函数中查询数据库(bad),并且不使用异步EF方法(bad…此代码可能会死锁)。这里要查找的是视图组件。
    @foreach (Product item in @ViewData["MyKey"] as IList<Product>)
    {
        <li><a>@item.Name</a></li>
    }