临时数据始终为 0
TempData is always 0
关于我正在编写的网络应用程序的背景。我有一个创建产品的剃刀页面(信息被插入到数据库中,数据库正在创建产品 ID)。之后,在 post 请求中,我想重定向到显示有关该产品的所有信息的另一个页面 razor。
我试图通过使用 TempData 传递产品 ID,但由于某种原因,它始终为 0。我想指出,我对 MVC 和 ASP.NET 核心还很陌生。我知道我可能需要创建一个控制器来传递数据,但我不确定。
下面是我的代码:
CreateProduct.cshthml.cs:
using Accounts.Data;
using Accounts.Domain;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Template_Site.Pages
{
public class CreateProductModel : PageModel
{
private readonly IProductRepository _products;
[TempData]
public int productId { get; set; }
[BindProperty]
public Product Product { get; set; }
public CreateProductModel(IProductRepository product)
{
_products=product;
}
public IActionResult OnGet()
{
return Page();
}
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
//_products.AddProduct(Product);
//_products.SaveAll();
productId = _products.RecentProduct().Id;
return RedirectToPage("/ProductReDirect", productId);
}
return Page();
}
}
}
CreateProduct.cshthml:
@page
@model Template_Site.Pages.CreateProductModel
@{
}
<div class="header">
<h1>Product Creation</h1>
</div>
<div class="row">
<form method ="post">
<div class="column side"></div>
<div class= "column middle">
<div class="ForForm">
<label asp-for=@Model.Product.Name></label>
<input asp-for=@Model.Product.Name class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Name></span>
</div>
<div class="ForForm">
<label asp-for=@Model.Product.Version></label>
<input asp-for=@Model.Product.Version class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Version></span>
</div>
<div class="ForForm" >
<label asp-for=@Model.Product.Amount></label>
<input asp-for=@Model.Product.Amount class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Amount></span>
</div>
<div>
<button type="submit" class= "button button3" asp-page="/ProductReDirect" asp-route-productId=@Model.productId>Create</button>
</div>
</div>
<div class="column side"></div>
</form>
</div>
ProductReDirect.cshtml.cs:
using Accounts.Data;
using Accounts.Domain;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Template_Site.Pages
{
public class ProductReDirectModel : PageModel
{
private readonly IProductRepository _product;
public Product Product { get; set; }
[BindProperty(SupportsGet = true)]
public int productId { get; set; }
public ProductReDirectModel(IProductRepository product)
{
_product = product;
}
public void OnGet()
{
productId = (int)TempData["productId"];
TempData.Keep("productId");
Product = new Product();
Product = _product.GetById(productId);
}
}
}
ProductReDirect.csthml:
@page
@model Template_Site.Pages.ProductReDirectModel
@{
}
<h2>You created a new product!</h2>
<h2> id: @Model.productId</h2>
首先,您需要删除按钮中的asp-page
和asp-route-productId
,否则您将不会进入CreateProduct.cshtml.cs中的OnPost处理程序:
CreateProduct.cshthml:
@page
@model Template_Site.Pages.CreateProductModel
@{
}
<div class="header">
<h1>Product Creation</h1>
</div>
<div class="row">
<form method ="post">
<div class="column side"></div>
<div class= "column middle">
<div class="ForForm">
<label asp-for=@Model.Product.Name></label>
<input asp-for=@Model.Product.Name class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Name></span>
</div>
<div class="ForForm">
<label asp-for=@Model.Product.Version></label>
<input asp-for=@Model.Product.Version class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Version></span>
</div>
<div class="ForForm" >
<label asp-for=@Model.Product.Amount></label>
<input asp-for=@Model.Product.Amount class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Amount></span>
</div>
<div>
<button type="submit" class= "button button3" >Create</button>
</div>
</div>
<div class="column side"></div>
</form>
</div>
然后您需要像这样在 OnPost 处理程序中传递 productId:
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
//_products.AddProduct(Product);
//_products.SaveAll();
productId = _products.RecentProduct().Id;
return RedirectToPage("/ProductReDirect",new { productId = productId });
}
return Page();
}
}
并删除 ProductReDirect.cshtml.cs 中的 productId = (int)TempData["productId"];
:
public void OnGet()
{
Product = new Product();
Product = _product.GetById(productId);
}
关于我正在编写的网络应用程序的背景。我有一个创建产品的剃刀页面(信息被插入到数据库中,数据库正在创建产品 ID)。之后,在 post 请求中,我想重定向到显示有关该产品的所有信息的另一个页面 razor。
我试图通过使用 TempData 传递产品 ID,但由于某种原因,它始终为 0。我想指出,我对 MVC 和 ASP.NET 核心还很陌生。我知道我可能需要创建一个控制器来传递数据,但我不确定。 下面是我的代码:
CreateProduct.cshthml.cs:
using Accounts.Data;
using Accounts.Domain;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Template_Site.Pages
{
public class CreateProductModel : PageModel
{
private readonly IProductRepository _products;
[TempData]
public int productId { get; set; }
[BindProperty]
public Product Product { get; set; }
public CreateProductModel(IProductRepository product)
{
_products=product;
}
public IActionResult OnGet()
{
return Page();
}
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
//_products.AddProduct(Product);
//_products.SaveAll();
productId = _products.RecentProduct().Id;
return RedirectToPage("/ProductReDirect", productId);
}
return Page();
}
}
}
CreateProduct.cshthml:
@page
@model Template_Site.Pages.CreateProductModel
@{
}
<div class="header">
<h1>Product Creation</h1>
</div>
<div class="row">
<form method ="post">
<div class="column side"></div>
<div class= "column middle">
<div class="ForForm">
<label asp-for=@Model.Product.Name></label>
<input asp-for=@Model.Product.Name class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Name></span>
</div>
<div class="ForForm">
<label asp-for=@Model.Product.Version></label>
<input asp-for=@Model.Product.Version class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Version></span>
</div>
<div class="ForForm" >
<label asp-for=@Model.Product.Amount></label>
<input asp-for=@Model.Product.Amount class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Amount></span>
</div>
<div>
<button type="submit" class= "button button3" asp-page="/ProductReDirect" asp-route-productId=@Model.productId>Create</button>
</div>
</div>
<div class="column side"></div>
</form>
</div>
ProductReDirect.cshtml.cs:
using Accounts.Data;
using Accounts.Domain;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Template_Site.Pages
{
public class ProductReDirectModel : PageModel
{
private readonly IProductRepository _product;
public Product Product { get; set; }
[BindProperty(SupportsGet = true)]
public int productId { get; set; }
public ProductReDirectModel(IProductRepository product)
{
_product = product;
}
public void OnGet()
{
productId = (int)TempData["productId"];
TempData.Keep("productId");
Product = new Product();
Product = _product.GetById(productId);
}
}
}
ProductReDirect.csthml:
@page
@model Template_Site.Pages.ProductReDirectModel
@{
}
<h2>You created a new product!</h2>
<h2> id: @Model.productId</h2>
首先,您需要删除按钮中的asp-page
和asp-route-productId
,否则您将不会进入CreateProduct.cshtml.cs中的OnPost处理程序:
CreateProduct.cshthml:
@page
@model Template_Site.Pages.CreateProductModel
@{
}
<div class="header">
<h1>Product Creation</h1>
</div>
<div class="row">
<form method ="post">
<div class="column side"></div>
<div class= "column middle">
<div class="ForForm">
<label asp-for=@Model.Product.Name></label>
<input asp-for=@Model.Product.Name class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Name></span>
</div>
<div class="ForForm">
<label asp-for=@Model.Product.Version></label>
<input asp-for=@Model.Product.Version class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Version></span>
</div>
<div class="ForForm" >
<label asp-for=@Model.Product.Amount></label>
<input asp-for=@Model.Product.Amount class="form-contorl"/>
<span class="text-danger" asp-validation-for=@Model.Product.Amount></span>
</div>
<div>
<button type="submit" class= "button button3" >Create</button>
</div>
</div>
<div class="column side"></div>
</form>
</div>
然后您需要像这样在 OnPost 处理程序中传递 productId:
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
//_products.AddProduct(Product);
//_products.SaveAll();
productId = _products.RecentProduct().Id;
return RedirectToPage("/ProductReDirect",new { productId = productId });
}
return Page();
}
}
并删除 ProductReDirect.cshtml.cs 中的 productId = (int)TempData["productId"];
:
public void OnGet()
{
Product = new Product();
Product = _product.GetById(productId);
}