TempData 在我的 .NET Core 项目中不起作用
TempData does not work in my .NET Core project
我有非常简单的 ASP.NET 核心项目。这是我的控制器:
public class AdminController : Controller
{
private readonly IProductRepository _repository;
public AdminController(IProductRepository repository)
{
_repository = repository;
}
public ViewResult Index()
{
return View(_repository.Products.OrderBy(p => p.Id));
}
public ViewResult Edit(int id)
{
Product product = _repository.Products.FirstOrDefault(p => p.Id == id);
return View(product);
}
[HttpPost]
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
_repository.SaveProduct(product);
TempData["message"] = $"{product.Name} has been saved";
return RedirectToAction("Index");
}
return View(product);
}
}
还有我的看法_AdminLayout.cshtml
<main role="main" class="pb-3">
<div>
@if (TempData["message"] != null)
{
<div class="alert alert-success">
@TempData["message"]
</div>
}
</div>
@RenderBody()
</main>
最后Index.cshtml
查看
@model System.Collections.Generic.IEnumerable<Domains.Entities.Product>
@{
ViewBag.Title = "Admin";
Layout = "_AdminLayout";
}
<div>
// some cshtml code ...
</div>
如您所见,我正在等待以下业务逻辑:
保存一个产品;
重定向到 Index.cs
管理员视图
我在屏幕顶部看到有关成功保存产品的消息。
但是什么也没发生。保存后我没有看到消息,重定向到 Index
.
后 TempData
为空
此外,我对这种方法的单元测试有疑问。
这是我的测试代码:
[Test]
public void Can_Save_Valid_Changes()
{
Mock<IProductRepository> mock = new Mock<IProductRepository>();
AdminController controller = new AdminController(mock.Object);
Product product = new Product { Name = "Test"};
IActionResult result = controller.Edit(product);
// check if have saved product to repo
mock.Verify(m => m.SaveProduct(product));
Assert.IsNotInstanceOf<ViewResult>(result);
}
我使用 NUnit
库进行测试。 运行 测试后,我从测试中收到以下消息:object reference not set to an instance of an object
。似乎将值赋给 TempData
会在测试期间抛出此异常。
请告诉我,这个 TempData
是怎么回事?错误在哪里?我已经看到很多关于 TempData
的奇怪行为的问题,但我没有找到适合我的答案。我感谢任何帮助。
当对访问 TempData
的控制器进行单元测试时,您需要为控制器
创建一个 TempDataDictionary
[Test]
public void Can_Save_Valid_Changes() {
//Arrange
var httpContext = new DefaultHttpContext();
var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
var mock = new Mock<IProductRepository>();
AdminController controller = new AdminController(mock.Object);
controller.TempData = tempData;
Product product = new Product { Name = "Test"};
//Act
IActionResult result = controller.Edit(product);
//Assert
// check if have saved product to repo
mock.Verify(m => m.SaveProduct(product));
Assert.IsNotInstanceOf<ViewResult>(result);
Assert.IsTrue(tempData.ContainsKey("message"));
}
我有非常简单的 ASP.NET 核心项目。这是我的控制器:
public class AdminController : Controller
{
private readonly IProductRepository _repository;
public AdminController(IProductRepository repository)
{
_repository = repository;
}
public ViewResult Index()
{
return View(_repository.Products.OrderBy(p => p.Id));
}
public ViewResult Edit(int id)
{
Product product = _repository.Products.FirstOrDefault(p => p.Id == id);
return View(product);
}
[HttpPost]
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
_repository.SaveProduct(product);
TempData["message"] = $"{product.Name} has been saved";
return RedirectToAction("Index");
}
return View(product);
}
}
还有我的看法_AdminLayout.cshtml
<main role="main" class="pb-3">
<div>
@if (TempData["message"] != null)
{
<div class="alert alert-success">
@TempData["message"]
</div>
}
</div>
@RenderBody()
</main>
最后Index.cshtml
查看
@model System.Collections.Generic.IEnumerable<Domains.Entities.Product>
@{
ViewBag.Title = "Admin";
Layout = "_AdminLayout";
}
<div>
// some cshtml code ...
</div>
如您所见,我正在等待以下业务逻辑:
保存一个产品;
重定向到
Index.cs
管理员视图我在屏幕顶部看到有关成功保存产品的消息。
但是什么也没发生。保存后我没有看到消息,重定向到 Index
.
TempData
为空
此外,我对这种方法的单元测试有疑问。
这是我的测试代码:
[Test]
public void Can_Save_Valid_Changes()
{
Mock<IProductRepository> mock = new Mock<IProductRepository>();
AdminController controller = new AdminController(mock.Object);
Product product = new Product { Name = "Test"};
IActionResult result = controller.Edit(product);
// check if have saved product to repo
mock.Verify(m => m.SaveProduct(product));
Assert.IsNotInstanceOf<ViewResult>(result);
}
我使用 NUnit
库进行测试。 运行 测试后,我从测试中收到以下消息:object reference not set to an instance of an object
。似乎将值赋给 TempData
会在测试期间抛出此异常。
请告诉我,这个 TempData
是怎么回事?错误在哪里?我已经看到很多关于 TempData
的奇怪行为的问题,但我没有找到适合我的答案。我感谢任何帮助。
当对访问 TempData
的控制器进行单元测试时,您需要为控制器
TempDataDictionary
[Test]
public void Can_Save_Valid_Changes() {
//Arrange
var httpContext = new DefaultHttpContext();
var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
var mock = new Mock<IProductRepository>();
AdminController controller = new AdminController(mock.Object);
controller.TempData = tempData;
Product product = new Product { Name = "Test"};
//Act
IActionResult result = controller.Edit(product);
//Assert
// check if have saved product to repo
mock.Verify(m => m.SaveProduct(product));
Assert.IsNotInstanceOf<ViewResult>(result);
Assert.IsTrue(tempData.ContainsKey("message"));
}