【问题标题】:how to read data from the ViewModel如何从 ViewModel 中读取数据
【发布时间】:2016-04-12 00:33:53
【问题描述】:

我想获取 Unit_Price 和 Quantity 到 ActionResult 索引。

任何帮助表示赞赏

模型产品

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; }
}

ViewModel 产品

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>

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

enter image description here

【问题讨论】:

  • 究竟是哪一部分给您带来了麻烦?您向我们展示了一堆代码,但没有告诉我们问题所在。
  • 我不知道如何在 ViewModel 中显示价格和数量在行动指数
  • 更多信息。您的实施到底出了什么问题?

标签: c# asp.net-mvc entity-framework linq asp.net-mvc-5


【解决方案1】:

Product 的定义中有一个集合 ProductsDetails

您在此处循环浏览您的产品集合

@foreach (var _product in Model.Produkty)

但是在这个循环中,你然后执行以下操作

@foreach (var _cena in Model.ProductyDetails)

说实话没有多大意义,因为它只会显示所有产品细节。

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

@foreach (var _cena in _product.ProductsDetails)

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

【讨论】:

    【解决方案2】:

    我注意到的第一个问题,我相信它是 type-o 的副本,在您的 View Product Index 的第一行上。 应该是:

    @model CRM_Hurtownia.ViewModels.ProductViewModel
    

    不是

    @model CRM_Hurtownia.ViewModels.ProduktViewModel
    

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

    [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 正在使用 Model Product 的属性,Product 类。如果是,那么您需要

    1)

    Model Product 中的类从 Product 更改为 Producty。将第 1 行和第 3 行更改为:

    public class Producty
    {
        public Producty()
        {
    

    2) 或者您可以将 Product Index View 中的 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; }
    }
    

    如果您确实以这种方式更改它,那么在 Controller Product 的第 9 行,您必须将其更改为:

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

    同样,在第 17 行,您的 Product Controller 引用了 ProductyDetails 类。这个类不存在。我猜你应该把它作为ProductDetails?改成这样:

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

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


    我可能会选择第一个选项:

    Model Product 中的类从 Product 更改为 Producty。 减少工作量。

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

    【讨论】:

    • 我有另一种语言的变量,并通过 Replace 将变量名称翻译成英文,也许有些东西不能正常工作。这可能不是一个好主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多