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

Posted

技术标签:

【中文标题】.Net ViewModel 在页面刷新时不更新【英文标题】:.Net ViewModel not updating on page refresh 【发布时间】:2022-01-21 12:43:24 【问题描述】:

我一直在尝试在线寻找解决方案,例如here 和here。但它们似乎对我没有帮助,因为我的 GET 似乎没有在页面加载时更新我的​​视图模型,而这些提供了关于 POST 行为的解释。

当用户完全离开页面时,原始值如何仍在视图模型中。我也试过清除浏览器缓存,原来的值还在加载中。

我希望每次用户登陆页面时都进行干净的加载。

我正在从控制器中的数据库中获取用户的名字和姓氏。

我的控制器操作:

    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 为空 用户看到&lt;p class="font-danger" id="CreateArticleCardAuthor"&gt;@_loc[Model.AddName]&lt;/p&gt; 错误消息 用户导航到不同的设置页面并将他们的名字添加到数据库中 用户导航回原始页面 页面加载时viewModel.UserFirstName 是从数据库中填充的 使用&lt;p class="font-style-content-small-black" id="CreateArticleCardAuthor"&gt;@_loc[Model.Author]: @Model.UserFirstName @Model.UserLastName&lt;/p&gt; 用户不再看到错误

实际行为:

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

【问题讨论】:

您是否检查过填充模型是否已传递给视图? 【参考方案1】:

私有静态只读 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(依赖注入)无关,所以我没有介绍与此相关的示例代码。您可以google并了解DI和EF DBContext。

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

【讨论】:

是否应该有 IApplicationDbContext 的 using 语句,我不能将它添加到我的控制器类或 ApplicationDbContext 类中?另外,您认为这是我最初问题的答案,还是您分享的有用信息?谢谢 @DMur 我已经更新了答案。请看一看。我相信这将解决您的问题,同时提高应用程序的质量。 我收到一个不一致的可访问性错误,说 IApplicationDBContext 比我的控制器注入更难访问 @DMur 你是否为类和接口添加了public 关键字?

以上是关于.Net ViewModel 在页面刷新时不更新的主要内容,如果未能解决你的问题,请参考以下文章

php 如何在页面刷新时不重复操作数据库?

刷新 Kendo UI viewModel

php怎么不刷新页面更新数据.

asp.net如何实现既要触发dropdownlist改变事件时不刷新整个界面

刷新页面后可以用 Knockout JS 保存 ViewModel 的数据吗?

ASP.NET使用ajax实现分页局部刷新页面