如何从视图模型中读取数据

本文关键字:读取 数据 模型 视图 | 更新日期: 2023-09-27 18:29:26

我想获取Unit_Price和数量到操作结果索引。

任何帮助表示赞赏

模型产品

public class Product
{
    public Product()
    {
        ProductsDetails = new HashSet<ProductDetails>;();
    }
    [Key]//[Required]
    public int ID_Product { get; set; }
    [Required]
    public int ID_Subcategory { get; set; }
    [Required]
    public int ID_Category { get; set; }
    // [StringLength(50)]
    public string Product_Name { get; set; }
    //public byte Photo_Products { get; set; }
    // ID_Subcategory
    //public virtual ProductDetails ProductDetails { get; set; }
    [ForeignKey("ID_Subcategory")]
    public Subcategory Subcategories { get; set; }
    [ForeignKey("ID_Category")]
    public virtual Category Categories { get; set; }
    public virtual ICollection<ProductDetails> ProductsDetails { get; set; }
    public virtual ICollection<OrderDetails> OrdersDetails { get; set; }
}

型号产品详情

[Table("Product_Details")]
public class ProductDetails
{
    public ProductDetails()
    {
    }
    [Key]
    public int ID { get; set; }
    //[ForeignKey("Product")]
    public int ID_Product { get; set; }
    [Column(TypeName ="money")]
    public decimal Unit_Price{ get; set; }
    public int Quantity { get; set; }
    public float Vat { get; set; }
    public string Description { get; set; }
    [Column(TypeName = "money")]
    public decimal Gross_Value { get; set; }
    [Column(TypeName = "money")]
    public decimal Net_Value { get; set; }
    // ID_Product
    public virtual Product Product { get; set; }
}

视图模型生产

public class ProductViewModel
{
    public IEnumerable<Category> Categories { get; set; }
    public IEnumerable<Subcategory> Subcategories { get; set; }
    public IEnumerable<Product> Producty { get; set; }
    public IEnumerable<ProductDetails> ProductyDetails { get; set; }
}

控制器产品

[Authorize]
public class ProductController : Controller
{
    // GET: Product
    private Context db = new Context();
    public ActionResult Index()
    {
        var _product = db.Producty .Include(x => x.Categories)
                                   .Include(x => x.Subcategories)
                                   .OrderBy(x => x.Categories.Name_Category)
                                   .ToList();
        var _category = db.Categories.ToList();
        var _subcategory = db.Subcategories.ToList();
        var _price = db.Producty    .Join(db.ProductyDetails,
                                    sc => sc.ID_Product,
                                    soc => soc.ID_Product,
                                    (sc, soc) => new
                                    {
                                        Product = sc,
                                        ProductDetails = soc
                                    }).Select(soc => new {
                                       Cena = soc.ProductDetails.Unit_Price,
                                       Quantity = soc.ProductDetails.Quantity
                                    }).ToList();

        var _productDetails = db.ProductyDetails.Include(x => x.Unit_Price)
                                                    .Select(x => x.Unit_Price)
                                                    .ToList();
        var vm = new ProductViewModel()
        {
            //Categories = _category,
            //Subcategories = _subcategory,
            Producty = _product,
            //ProductyDetails = _price
            //ProductyDetails =_productDetails
        };
        return View(vm);

查看产品索引

@model CRM_Hurtownia.ViewModels.ProduktViewModel
@{
    ViewBag.Title = "Product";
    ViewBag.active = "Product";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h4 class="page-title">Product</h4>
@Html.ActionLink("Create Product", "Create", null, new { @class = "btn m-r-5" })
<table class="table table-bordered table-hover tile">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Categories)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Subcategories)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Products)
        </th>
        <th>
            Price
        </th>
        <th>
            Quantity
        </th>
        <th></th>
    </tr>
    @foreach (var _product in Model.Produkty)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => _product.Categories.Name_Category)
            </td>
            <td>
                @Html.DisplayFor(modelItem => _product.Subcategories.Name_Subcategory)
            </td>
            <td>
                @Html.DisplayFor(modelItem => _product.Product_Name)
            </td>
            @*@foreach (var _cena in Model.ProductyDetails)
            {
            <td>
                @Html.DisplayFor(modelItem => _cena.Unit_Price)
            </td>
            <td>
                @Html.DisplayFor(modelItem => _cena.Quantity)
            </td>
            }*@

            <td>
                @Html.ActionLink("Edit", "Edit", new { id = _product.ID_Produkt }) |
                @Html.ActionLink("Details", "Details", new { id = _product.ID_Produkt }) |
                @Html.ActionLink("Delete", "Delete", new { id = _product.ID_Produkt })
            </td>
        </tr>
    }
</table>

我已经尝试了很多方法,因此代码中的这些注释也许其中一些东西会很有用。

在此处输入图像描述

如何从视图模型中读取数据

>Product的定义中有一个集合ProductsDetails

您正在这里循环浏览您的产品系列

@foreach (var _product in Model.Produkty)

但在此循环中,您可以执行以下操作

@foreach (var _cena in Model.ProductyDetails)

老实说,这没有多大意义,因为它只会显示所有产品详细信息。

相反,您应该只在_product对象中显示ProductDetails

@foreach (var _cena in _product.ProductsDetails)

至少我认为这是正在发生的事情。

我注意到的第一个问题,我相信是 type-o 的副本,是在您的第 1 行中,您的 View 产品索引之一在第 1 行。它应该是:

@model CRM_Hurtownia.ViewModels.ProductViewModel

@model CRM_Hurtownia.ViewModels.ProduktViewModel

我注意到的另一个问题是,在您的视图产品索引第 15、18 和 21 行中,您希望在特定属性上使用 DisplayNameFor。不过,您必须为它们定义一个名称...因此,进入产品视图模型,在每个属性上方添加以下内容:

[Display(Name = "Set Primary")]

它应该看起来像这样:

public class ProductViewModel
{
   [Display(Name = "Name for Categories")]
   public IEnumerable<Category> Categories { get; set; }
   [Display(Name = "Name for Subcategories ")]
   public IEnumerable<Subcategory> Subcategories { get; set; }
   [Display(Name = "Name for Producty ")]
   public IEnumerable<Product> Producty { get; set; }
   [Display(Name = "Name for ProductyDetails ")]
   public IEnumerable<ProductDetails> ProductyDetails { get; set; }
}

另一个问题是您在查看产品索引中的 foreach 语句。VM 中没有 Produkty 的属性,它应该是 Producty

@foreach (var _product in Model.Producty)

如果是这样,现在我很困惑,因为它看起来 Producty 正在使用模型产品(产品类(的属性。如果是,那么您需要

1(

将类更改为">模型产品",从">产品"更改为"生产"。将第 1 行和第 3 行更改为:

public class Producty
{
    public Producty()
    {

2(或者,您可以将产品索引视图中的 foreach 更改为:

@foreach (var _product in Model.Product)

并将产品视图模型更改为:

public class ProductViewModel
{
   [Display(Name = "Name for Categories")]
   public IEnumerable<Category> Categories { get; set; }
   [Display(Name = "Name for Subcategories ")]
   public IEnumerable<Subcategory> Subcategories { get; set; }
   [Display(Name = "Name for Producty ")]
   public IEnumerable<Product> Product { get; set; }
   [Display(Name = "Name for ProductyDetails ")]
   public IEnumerable<ProductDetails> ProductyDetails { get; set; }
}

如果确实以这种方式更改它,则在控制器产品的第 9 行中,必须将其更改为:

var _product = db.Product .Include(x => x.Categories)

同样,在第 17 行的产品控制器中,它引用了 ProductyDetails 类。此类不存在。我猜你应该把它作为产品详细信息?将其更改为:

var _price = db.Producty    .Join(db.ProductDetails,

还要检查第 31 行和第 38 行中的语法。


不过,我可能会选择第一个选项:

将类更改为">模型产品",从">产品"更改为"生产"。 减少工作量。

检查语法。我不确定您是否有任何其他逻辑错误。