如何从视图模型中读取数据
本文关键字:读取 数据 模型 视图 | 更新日期: 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 行中的语法。
不过,我可能会选择第一个选项:
将类更改为">模型产品",从">产品"更改为"生产"。 减少工作量。
检查语法。我不确定您是否有任何其他逻辑错误。