ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现

在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在。接着,把CheckBoxList的选中项组合生成产品SKU项。

本系列将在ASP.NET MVC中实现以上功能。但本篇,先在控制台实现属性值的笛卡尔乘积。

关于属性的类:

    public class Prop
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

关于属性项的类:

    public class PropOption
    {
        public int Id { get; set; }
        public string RealValue { get; set; } //存储属性值
        public int PropId { get; set; }
    }    

通过几个方法模拟有关属性和属性项的数据。

        static List<Prop> GetProps()
        {
            return new List<Prop>()
            {
                new Prop(){Id = 1, Name = "颜色"},
                new Prop(){Id = 2, Name = "尺寸"}
            };
        }

        static List<PropOption> GetPropOptions()
        {
            return new List<PropOption>()
            {
                  new PropOption(){Id = 1, RealValue = "红色", PropId = 1},
                  new PropOption(){Id = 2, RealValue = "蓝色", PropId = 1},
                  new PropOption(){Id = 3, RealValue = "橙色", PropId = 1},
                  new PropOption(){Id = 4, RealValue = "5英寸", PropId = 2},
                  new PropOption(){Id = 5, RealValue = "8英寸", PropId = 2},
                  new PropOption(){Id = 6, RealValue = "10英寸", PropId = 2},
            };
        }

        static string GetValueByPropOptionId(int id)
        {
            return (GetPropOptions().Where(p => p.Id == id).FirstOrDefault()).RealValue;
        }


以上,
GetProps方法获取所有属性
GetPropOptions方法获取所有属性值
GetValueByPropOptionId方法根据属性项的Id获取属性值

接下来,可能就是在前台勾选CheckBoxList的项,把属性Id和对应的属性项Id封装成PropAndOption类。

    public class PropAndOption
    {
        public int PropId { get; set; }
        public int OptionId { get; set; }
    }

在服务端拿到的PropAndOption对象集合假设是这样的:

            //从前端获取的所有属性Id和属性项Id
            var tempList = new List<PropAndOption>()
            {
                new PropAndOption(){PropId = 1, OptionId = 1},
                new PropAndOption(){PropId = 1, OptionId = 2},
                new PropAndOption(){PropId = 1, OptionId = 3},
                new PropAndOption(){PropId = 2, OptionId = 4},
                new PropAndOption(){PropId = 2, OptionId = 5},
                new PropAndOption(){PropId = 2, OptionId = 6}
            };

接着,把List<PropAndOption>集合以PropId为分组标准,分成2组:

            //根据属性Id分组,并得到属性值的分组
            var groupTempList = (from item in tempList
                group item by item.PropId
                into grp
                select grp.Select(t => GetValueByPropOptionId(t.OptionId))).ToList();

于是,得到类似如下的结果:

组1:
红色
蓝色
橙色

组2:
5英寸
8英寸
10英寸

接着,把组1和组2进行笛卡尔乘积,我们的目的是想得到类似如下的string类型的集合:

红色 5英寸
红色 8英寸
红色 10英寸

以下声明一个string集合类型变量result

            IEnumerable<string> result;
            result = groupTempList.First();
            groupTempList.RemoveAt(0);
            groupTempList.ForEach(delegate(IEnumerable<string> value)
            {
                result = (from r in result
                    from v in value
                    select r + " " + v).ToList();
            });

最后遍历result这个字符串类型的集合。

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }

完整的代码为:

using System;
using System.Collections.Generic;
using System.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //从前端获取的所有属性Id和属性项Id
            var tempList = new List<PropAndOption>()
            {
                new PropAndOption(){PropId = 1, OptionId = 1},
                new PropAndOption(){PropId = 1, OptionId = 2},
                new PropAndOption(){PropId = 1, OptionId = 3},
                new PropAndOption(){PropId = 2, OptionId = 4},
                new PropAndOption(){PropId = 2, OptionId = 5},
                new PropAndOption(){PropId = 2, OptionId = 6}
            };

            //根据属性Id分组,并得到属性值的分组
            var groupTempList = (from item in tempList
                group item by item.PropId
                into grp
                select grp.Select(t => GetValueByPropOptionId(t.OptionId))).ToList();

            IEnumerable<string> result;
            result = groupTempList.First();
            groupTempList.RemoveAt(0);
            groupTempList.ForEach(delegate(IEnumerable<string> value)
            {
                result = (from r in result
                    from v in value
                    select r + " " + v).ToList();
            });

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }

        static List<Prop> GetProps()
        {
            return new List<Prop>()
            {
                new Prop(){Id = 1, Name = "颜色"},
                new Prop(){Id = 2, Name = "尺寸"}
            };
        }

        static List<PropOption> GetPropOptions()
        {
            return new List<PropOption>()
            {
                  new PropOption(){Id = 1, RealValue = "红色", PropId = 1},
                  new PropOption(){Id = 2, RealValue = "蓝色", PropId = 1},
                  new PropOption(){Id = 3, RealValue = "橙色", PropId = 1},
                  new PropOption(){Id = 4, RealValue = "5英寸", PropId = 2},
                  new PropOption(){Id = 5, RealValue = "8英寸", PropId = 2},
                  new PropOption(){Id = 6, RealValue = "10英寸", PropId = 2},
            };
        }

        static string GetValueByPropOptionId(int id)
        {
            return (GetPropOptions().Where(p => p.Id == id).FirstOrDefault()).RealValue;
        }

    }

    public class Prop
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class PropOption
    {
        public int Id { get; set; }
        public string RealValue { get; set; }
        public int PropId { get; set; }
    }

    public class PropAndOption
    {
        public int PropId { get; set; }
        public int OptionId { get; set; }
    }

}


运行。

如果在服务端只收到一个属性Id和属性项Id组成的PropAndOptio对象。

            var tempList = new List<PropAndOption>()
            {
                new PropAndOption(){PropId = 1, OptionId = 1}
            };

在下一篇,将在ASP.NET MVC中实现属性值的笛卡尔乘积。

时间: 2024-12-28 04:55:07

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现的相关文章

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现

在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面中勾选CheckBoxList中属性值选项: 把勾选的属性值进行笛卡尔乘积,每行需要填写价格: 我们暂且不考虑这些CheckBoxList是如何显示出来的(在后续有关商品模块的文章中会实现),还需考虑的方面包括: 1.从CheckBoxList中获取到什么再往控制器传? 对于每行的CheckBoxList来说

ASP.NET MVC中商品模块小样

在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现  2.ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现   3.再议ASP.NET MVC中CheckBoxList的验证   4.ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE

Asp.Net MVC中DropDownListFor的用法(转)

2016.03.04 扩展:如果 view中传入的是List<T>类型 怎么使用 DropList 既然是List<T> 那么我转化成 T  List<T>的第一个,最后一个不就是M吗? @Html.DropDownListFor(model=>model.First().Title, ViewData["Title"] as List<SelectListItem>, "标题", @"dropdown

关于asp.net MVC 中的TryUpdateModel方法

有比较才会有收货,有需求才会发现更多. 在传统的WebFormk开发工作中,我们常常会存在如下的代码块 //保存 protected void btnSubmit_Click(object sender, EventArgs e) { try { BLL.MoneyBll cun = new BLL.MoneyBll(); Model.Money m1 = new Model.Money(); m1.Commany = int.Parse(this.Commany.Text); m1.Count

Asp.Net MVC中使用ACE模板之Jqgrid

第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为后台开发节省了大量时间. 发现虽然不是完美,整体效果还是不错,特此分享给园友.这一节先讲其中的Jqgrid.按照国际惯例,先上两张图. 集成了button,form,treeview以及日历,时间轴.chart等控件,非常丰富.下面是Jqgrid在MVC中的使用. jqgrid的加载,排序,查找都是基于后台方法,不是在内存中完成,但也有一些小坑.下面一一道

ASP.NET MVC中实现多个button提交的几种方法

有时候会遇到这样的情况:在一个表单上须要多个button来完毕不同的功能,比方一个简单的审批功能. 假设是用webform那不须要讨论,但asp.net mvc中一个表单仅仅能提交到一个Action处理,相对照较麻烦点. 方法一:使用client脚本 比方我们在View中这样写: <inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Actio

警惕ASP.NET MVC中的ValidateInputAttribute

最近在做一个ASP.NET MVC项目的时候发现,有一个Controller的Action死活都没法接收到从客户端提交过来的Html表单请求和数据,后来才发现是因为默认情况下ASP.NET MVC在执行Controller的代码前,会对客户端提交到服务器的数据做安全性验证,如果ASP.NET检测到客户端提交的数据中有危险数据(危险数据一般是一些关键字和关键符号),那么就会中断当前客户端提交的请求并且引发一个异常,那么客户端提交的数据自然就不会进入到Controller和Action了.主要原因是

【MVC】ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 使用客户端脚本 <input type="submit" value="审核通过" onclick='this.form.action="<%=Url.Action("Action1") %>";' /