.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>
}
预期行为:
- 页面加载并且用户没有数据库中的名字
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>
还在用
- 用户仍然看到错误
private static readonly ApplicationDbContext _context = new();
不应将 DBContect 作为静态对象。因为除非您重新加载它,否则它永远不会获取某些更改。它将在 http 请求中保持活动状态。配置依赖注入以在收到 http 请求时创建单个 ApplicationDbContext 对象。
在Startup
class中,在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()
关键字创建它。
我一直试图在网上找到解决这个问题的方法,比如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>
}
预期行为:
- 页面加载并且用户没有数据库中的名字
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>
还在用- 用户仍然看到错误
private static readonly ApplicationDbContext _context = new();
不应将 DBContect 作为静态对象。因为除非您重新加载它,否则它永远不会获取某些更改。它将在 http 请求中保持活动状态。配置依赖注入以在收到 http 请求时创建单个 ApplicationDbContext 对象。
在Startup
class中,在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()
关键字创建它。