.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
为空
用户看到<p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>
错误消息
用户导航到不同的设置页面并将他们的名字添加到数据库中
用户导航回原始页面
页面加载时viewModel.UserFirstName
是从数据库中填充的
使用<p class="font-style-content-small-black" id="CreateArticleCardAuthor">@_loc[Model.Author]: @Model.UserFirstName @Model.UserLastName</p>
用户不再看到错误
实际行为:
-
页面加载并且用户没有在数据库中有名字
viewModel.UserFirstName
为空
用户看到<p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>
错误消息
用户导航到不同的设置页面并将他们的名字添加到数据库中
用户导航回原始页面
页面加载时viewModel.UserFirstName
仍然为空
<p class="font-danger" id="CreateArticleCardAuthor">@_loc[Model.AddName]</p>
还在使用中
用户仍然看到错误
【问题讨论】:
您是否检查过填充模型是否已传递给视图? 【参考方案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 在页面刷新时不更新的主要内容,如果未能解决你的问题,请参考以下文章
asp.net如何实现既要触发dropdownlist改变事件时不刷新整个界面