[英]How to get the urlHelper from html helper context in asp.net core mvc html helper static method
[英]how to access db context within a static method/class in asp.net core 2
我有一個帶有 EF 6 的 asp.net core 2 webapplication。到目前為止,我一直使用 db context 的方式是使用 asp.net core 提供的依賴注入將上下文注入控制器:
protected DbContext dbContext;
public BaseController(DbContext context)
{
dbContext = context;
}
在我的許多 razor 視圖中,我調用了一個擴展方法來初始化一個 Telerik 網格,並傳遞它的選項。 到目前為止,我還不需要訪問 db 上下文,但現在我需要在擴展方法中訪問它以實現某些邏輯:
public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, string controllerName, string gridName)
where T : class, IProcessViewModel
{
bool showDelete = false;
//check if the current user has edit rights
using (var db = new DbContext())
{
var users = db.Users.ToList(); // <--- this just doesn't get any records.
}
當試圖從靜態方法中實例化一個新的數據庫上下文時,它只是不獲取任何記錄。 我需要弄清楚如何實際訪問 DbContext 的新實例,或者以某種方式訪問在我的 Startup.cs 中定義的范圍服務:
services.AddScoped(_ => new MantleMapperContext(Configuration.GetConnectionString("DbContext")));
編輯:
如下所示,我最終將 dbContext 服務直接注入到我的視圖中,然后像這樣將其傳遞到方法中:
@inject DbContext dbContext
您將必須傳入您的DbContext
,或者從容器中獲取一個實例,您反過來也需要一個靜態引用(這會使大多數代碼審查失敗)。
做你正在做的事情,它在沒有連接字符串的情況下進行初始化,因為它在注入時會被連接起來。
由於這是static
的解決方案是傳入DbContext
。
public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, DbContext db, string controllerName, string gridName)
where T : class, IProcessViewModel
{
bool showDelete = false;
var users = db.Users.ToList(); // <--- gets records.
更新
我將如何從剃刀視圖中做到這一點?
我相信您可以將服務注入視圖。
可以使用@inject 指令將服務注入到視圖中。 您可以將@inject 視為向視圖添加屬性,並使用 DI 填充該屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.