首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TempData总是0

TempData总是0
EN

Stack Overflow用户
提问于 2022-03-04 09:24:44
回答 1查看 44关注 0票数 1

关于我正在编写的网络应用程序的背景。我有一个创建产品的剃须刀页面(信息被插入到数据库中,数据库正在创建产品Id)。之后,在post请求中,我想重定向到另一个显示该产品所有信息的页面剃须刀。

我试图使用TempData传递产品Id,但出于某种原因,它总是0。我想指出,我对MVC和ASP.NET核心相当陌生。我知道我可能需要创建一个控制器来传递数据,但我不确定。下面是我的代码:

CreateProduct.cshthml.cs:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@page
@model Template_Site.Pages.ProductReDirectModel
@{
}
<h2>You created a new product!</h2>

<h2> id: @Model.productId</h2>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-04 10:26:47

首先,您需要在按钮中删除asp-pageasp-route-productId,否则将不会转到CreateProduct.cshtml.cs中的OnPost处理程序:

CreateProduct.cshthml:

代码语言:javascript
复制
@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>

然后,您需要像这样在productId处理程序中传递OnPost:

代码语言:javascript
复制
 public IActionResult OnPost()
        {
            if (ModelState.IsValid)
            {

                //_products.AddProduct(Product);
                //_products.SaveAll();
               productId = _products.RecentProduct().Id;
                return RedirectToPage("/ProductReDirect",new { productId = productId });

            }
            return Page();

        }
    }

并删除productId = (int)TempData["productId"];中的ProductReDirect.cshtml.cs:

代码语言:javascript
复制
public void OnGet()
        {
            Product = new Product();
            Product = _product.GetById(productId);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71349204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档