我一直在嘗試在線尋找解決方案,例如此處和此處。但它們似乎沒有幫助我,因為看起來我的GET沒有在頁面加載時更新我的??視圖模型,而那些提供了關于 POST 行為的解釋。
當用戶完全離開頁面時,原始值如何仍在 viewModel 中。我也嘗試清除瀏覽器快取,原始值仍在加載。
每次用戶登陸頁面時,我都想要一個干凈的負載。
我從控制器的資料庫中獲取用戶的名字和姓氏。
我的控制器操作:
public class CreateArticleController : Controller
{
private static readonly ApplicationDbContext _context = new();
public IActionResult CreateArticle()
{
ModelState.Clear();
CreateArticlePageLocSourceNames _locSourceCreateArticlePageNameReferenceLibrary = new CreateArticlePageLocSourceNames();
var viewModel = new CreateArticleViewModel
{
PageTabTitle = _locSourceCreateArticlePageNameReferenceLibrary.GetLocSourcePageTabTitleNameReferenceForCreateArticlePage(),
Title = _locSourceCreateArticlePageNameReferenceLibrary.GetLocSourceTitleNameReferenceForCreateArticlePage()
//Other viewModel values are also being populated here
};
var user = User.GetUserId<string>();
var userDetails = _context.Users.Find(user);
if (userDetails.FirstName != null)
{
viewModel.UserFirstName = userDetails.FirstName.ToString();
Debug.WriteLine("************* UserFirstName: " viewModel.UserFirstName);
} else
{
viewModel.UserFirstName = null;
Debug.WriteLine("************* UserFirstName IS NULL");
}
if (userDetails.LastName != null)
{
viewModel.UserLastName = userDetails.LastName.ToString();
Debug.WriteLine("************* UserLastName: " viewModel.UserLastName);
}
else
{
viewModel.UserLastName = null;
Debug.WriteLine("************* UserLastName IS NULL");
}
return View(viewModel);
}
}
然后我在視圖中檢查名字和姓氏是否有值。如果有,我會使用它們,如果沒有,我會顯示一條錯誤訊息。
@if (Model.UserFirstName == "" || Model.UserFirstName == null || Model.UserLastName == "" || Model.UserLastName == null)
{
<p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>
}
else
{
<p class="font-style-content-small-black" id="CreateArticleCardAuthor">@_loc[Model.Author]: @Model.UserFirstName @Model.UserLastName</p>
}
預期行為:
- 頁面加載和用戶在資料庫中沒有名字
viewModel.UserFirstName一片空白- 用戶看到
<p id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>錯誤訊息 - 用戶導航到不同的設定頁面并將他們的名字添加到資料庫中
- 用戶導航回原始頁面
- 在頁面加載時
viewModel.UserFirstName從資料庫填充 <p id="CreateArticleCardAuthor">@_loc[Model.Author]: @Model.UserFirstName @Model.UserLastName</p>用來- 用戶不再看到錯誤
實際行為:
- 頁面加載和用戶在資料庫中沒有名字
viewModel.UserFirstName一片空白- 用戶看到
<p id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>錯誤訊息 - 用戶導航到不同的設定頁面并將他們的名字添加到資料庫中
- 用戶導航回原始頁面
- 在頁面加載時
viewModel.UserFirstName仍然為空 <p id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>仍在使用- 用戶仍然看到錯誤
uj5u.com熱心網友回復:
私有靜態只讀 ApplicationDbContext _context = new();
不應將 DBContect 作為靜態物件。因為除非您重新加載它,否則它永遠不會接受某些更改。它將在 http 請求中保持活動狀態。配置依賴注入以在 http 請求傳入時創建單個 ApplicationDbContext 物件。
在Startup類中,在ConfigureServices方法中寫入:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyProjectContext")));
這里的“MyProjectContext”是 appsettings.json 檔案中連接字串的名稱。
然后在控制器類中:
public class CreateArticleController : Controller
{
private ApplicationDbContext _context;
public CreateArticle(IApplicationDbContext context)
{
_context = context;
}
public IActionResult CreateArticle()
{
// Your codes ...
}
}
要使上述代碼作業,您ApplicationDbContext需要繼承一個介面(可以為空)以使 DI 作業。像這樣:
public class ApplicationDbContext : DbContext, IApplicationDbContext
這個問題與 DI(依賴注入)無關,所以我沒有涵蓋與此相關的示例代碼。您可以谷歌并了解 DI 和 EF DBContext。
2021 年 12 月 22 日更新:
這IApplicationDbContext是您必須為 DI 實作的介面(目前是一個空介面)。然后你會自動在你的控制器中得到一個物件。即您不必用new()關鍵字創建它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392677.html
標籤:网站 。网 asp.net-mvc 模型视图控制器 看法
