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

我一直在尝试在线寻找解决方案,例如herehere。但它们似乎对我没有帮助,因为我的 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>
        }

预期行为:

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

实际行为:

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

【问题讨论】:

  • 您是否检查过填充模型是否已传递给视图?

标签: asp.net .net asp.net-mvc model-view-controller view


【解决方案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 关键字?
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多