.Net ViewModel 不在页面刷新时更新

.Net ViewModel not updating on page refresh

我一直试图在网上找到解决这个问题的方法,比如here and here。但它们似乎对我没有帮助,因为我的 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>
        }

预期行为:

  1. 页面加载并且用户没有数据库中的名字
  2. viewModel.UserFirstName 为空
  3. 用户看到 <p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p> 错误消息
  4. 用户导航到不同的设置页面并将他们的名字添加到数据库
  5. 用户导航回原始页面
  6. 在页面加载时 viewModel.UserFirstName 从数据库中填充
  7. <p class="font-style-content-small-black" id="CreateArticleCardAuthor">@_loc[Model.Author]: @Model.UserFirstName @Model.UserLastName</p>已使用
  8. 用户不再看到错误

实际行为:

  1. 页面加载并且用户没有数据库中的名字
  2. viewModel.UserFirstName 为空
  3. 用户看到 <p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p> 错误消息
  4. 用户导航到不同的设置页面并将他们的名字添加到数据库
  5. 用户导航回原始页面
  6. 在页面加载时 viewModel.UserFirstName 仍然为空
  7. <p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>还在用
  8. 用户仍然看到错误

private static readonly ApplicationDbContext _context = new();

不应将 DBContect 作为静态对象。因为除非您重新加载它,否则它永远不会获取某些更改。它将在 http 请求中保持活动状态。配置依赖注入以在收到 http 请求时创建单个 ApplicationDbContext 对象。

Startupclass中,在ConfigureServices方法中写入:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyProjectContext")));

这里的 'MyProjectContext' 是您 appsettings.json 文件中的连接字符串的名称。

然后在控制器中class:

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(依赖注入)的,所以我没有涵盖与之相关的示例代码。您可以 google 并了解 DI 和 EF DBContext。

2021 年 12 月 22 日更新: IApplicationDbContext 是您必须为 DI 实现的接口(目前是一个空接口)。然后你会自动在你的控制器中得到一个对象。也就是说,您不必使用 new() 关键字创建它。