_layout页面中使用Entity Framework的下拉列表

时间:2019-03-30 18:41:40

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

使用剃须刀页面。我想要在_Layout.cshtml中创建的标题中的下拉列表。这将由基于登录用户ID的EF数据库查询填充。该列表将是任何查询的全局过滤器。它需要响应选择更改。它将使用cookie跟踪各个会话。然后,每个显示数据的页面都将能够访问该值并过滤其结果。每个页面都可以读取Cookie值,也可以访问下拉列表中的值。

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以为您的控制器创建一个基类,该基类可在每次请求时将所需数据添加到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处理程序在下拉列表的值更改时立即提交该表单,而无需手动提交该表单。