【问题标题】:Dropdown list using Entity Framework in _layout page在 _layout 页面中使用实体框架的下拉列表
【发布时间】:2019-03-31 03:17:35
【问题描述】:

使用 Razor 页面。我想要在 _Layout.cshtml 中创建的标题中的下拉列表。这将由基于登录用户 ID 的 EF 数据库查询填充。此列表将成为任何查询的全局过滤器。它需要响应选择变化。它将使用 cookie 来跟踪会话之间的会话。然后每个显示数据的页面都可以访问该值并过滤其结果。每个页面都可以只读取 cookie 值或访问下拉列表中的值。

尝试使用部分和视图组件。无论哪种方式都不起作用,因为它总是试图传递调用页面的模型(索引、创建、报告),因为它是由每个而不是完全由没有模型的 _Layout 加载的。所以,现在我无法使用 Partial 或 View 组件中的模型来绑定下拉列表。

我也无法通过更改下拉列表来触发 OnPostAsync 事件。

根据我所做的所有尝试,这似乎是不可能的。我假设它可能需要 javascript 来完成所有工作,但我不确定正确的使用方法。

【问题讨论】:

    标签: c# .net-core razor-pages


    【解决方案1】:

    您可以为您的控制器创建一个基类,它会在每次请求时将所需的数据添加到 ViewBag。注意:以下代码基于 ASP.NET MVC,不是 ASP.NET Core,但 afaik 过程类似。

    public class ApplicationControllerBase : ControllerBase
    {
        protected override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            // use ViewResultBase, if you need logic for both full and partial views. Since you want to add info for the _Layout page, ViewResult is better.
            if (filterContext.Result is ViewResult viewResult)
            {
                // Give the ViewBag item a unique name, that will not be used elsewhere, so you don't overwrite anything by accident.
                // Use the data from ViewBag to populate your dropdown.
                viewResult.ViewBag.DropDownItems = GetDropDownItems(); // implement GetDropDownItems accordingly, preferrably with caching!
            }
            base.OnResultExecuting(filterContext);
        }
    }
    

    至于关于在 DropDownList 更改其值时调用 OnPostAsync 的问题的第二部分:是的,您可以为此使用 JS,除非您想在其周围添加一个额外的表单和一个额外的提交按钮。表单在任何情况下都可能有意义,但您可以使用 onchange 处理程序在下拉列表的值更改时立即提交表单,而不需要手动提交表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 2017-07-11
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多