[回馈]ASP.NET Core MVC开发实战之商城系统(四)

简介: 经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面等功能的开发,今天继续讲解商品详情功能开发,仅供学习分享使用,如有不足之处,还请指正。

经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面等功能的开发,今天继续讲解商品详情功能开发,仅供学习分享使用,如有不足之处,还请指正。

 

商品详情功能说明

 

首页和商品列表,都是只展示商品的主要信息,如商品名称,商品价格,类型等内容,让人有一个先入为主的商品概念,当用户对商品有兴趣时,可以点击链接跳转商品详情页面,查看商品更全面的信息,如:颜色,尺寸等内容。

 

商品详情功能设计

 

根据商品详情页面功能说明,在此页面,用户可以查看商品的具体内容,如:图片,颜色,大小,类型,标签以及加入购物车,立即购买等功能,具体页面设计如下所示:

 

商品详情页面功能开发

 

商品详情主要展示商品信息和商品配置信息。

 

1. 数据表创建

 

关于商品表EB_Product和对应模型Product的创建,可参考第二篇文章。商品配置表EB_ProductConfig,主要配置商品的特殊属性,如:颜色,尺寸,缩略图等内容,如下所示:

创建表的语句,如下所示:

CREATETABLE[dbo].[EB_ProductConfig]([Id][bigint] IDENTITY(1,1)NOTNULL,[ProductId][bigint]NULL,[ConfigType][varchar](50)NULL,[ConfigName][varchar](50)NULL,[ConfigValue][varchar](150)NULL,[CreateTime][datetime]NULL,[CreateUser][varchar](50)NULL,[LastEditTime][datetime]NULL,[LastEditUser][varchar](50)NULL)ON[PRIMARY]

 

2. 商品配置实体创建

 

商品配置表对应的项目模型实体,和数据表一一对应,如下所示:

namespaceEasyBuyShop.Models{
/// <summary>/// 产品配置,主要配置颜色,大小,缩略图路径等/// </summary>    [SqlSugar.SugarTable("EB_ProductConfig")]
publicclassProductConfig : EntityModel    {
publiclongProductId { get; set; }
publicstringConfigType { get; set; }
publicstringConfigName { get; set; }
publicstringConfigValue { get; set; }
    }
}

 

3. 数据处理层DAL

 

商品详情页面主要根据商品ID获取商品的详细信息以及商品配置信息,如下所示:

商品详细信息在ProductDal中,如下所示:

publicProductGetProduct(longId)
{
try    {
using (vardb=this.GetDb(BaseDal.ConnStr))
        {
returndb.Queryable<Product>().First(r=>r.Id==Id);
        }
    }
catch (Exceptionex)
    {
LogHelper.Fatal(ex.Message);
returnnull;
    }
}

商品配置信息在ProductConfigDal中,获取配置信息如下所示:

usingEasyBuyShop.Models;
usingEasyBuyShop.Utils;
namespaceEasyBuyShop.DAL{
publicclassProductConfigDal : BaseDal    {
publicProductConfigDal()
        {
        }
/// <summary>/// 获取产品配置/// </summary>/// <param name="productId"></param>/// <returns></returns>publicList<ProductConfig>GetProductConfigListById(longproductId)
        {
try            {
using (vardb=this.GetDb(BaseDal.ConnStr))
                {
returndb.Queryable<ProductConfig>().Where(r=>r.ProductId==productId).ToList();
                }
            }
catch (Exceptionex)
            {
LogHelper.Fatal(ex.Message);
returnnewList<ProductConfig>();
            }
        }
    }
}

 

4. 控制器获取

 

商品详细信息在ProductController的Detail方法中,根据传入的ID进行读取,如下所示:

publicIActionResultDetail(intId)
{
varusername=HttpContext.Session.GetString("username");
varrealName=HttpContext.Session.GetString("realname");
ViewData["Username"] =username;
ViewData["RealName"] =realName;
ProductDalproductDal=newProductDal();
ProductConfigDalproductConfigDal=newProductConfigDal();
varproduct=productDal.GetProduct(Id);
varproductConfigList=productConfigDal.GetProductConfigListById(Id);
ViewData["ProductConfigList"]=productConfigList;
ViewData["Product"] =product;
returnView();
}

将获取到的Product对象和ProductConfigList列表对象通过ViewData传递到View视图层中进行展示。

 

5. 视图层展示

 

在Views/Product/Detail.cshtml中,接收控制器方法传递的数据,并进行展示。如下所示:

@{
    ViewData["Title"] = "商品详情";
}
@{
    var product = ViewData["Product"] as Product;
    var productConfigList = ViewData["ProductConfigList"] as List<ProductConfig>;
}
<divclass=""><formmethod="post"id="detailForm"><inputtype="hidden"name="productId"value="@(product.Id)"/><inputtype="hidden"name="color"id="color"value=""/><inputtype="hidden"name="size"id="size"value=""/><!-- quick view start --><divclass="container"><divclass="row"><divid="view-gallery"><divclass="col-xs-12"><divclass="d-table"style="width:100%"><divclass="d-tablecell"><divclass="main-view modal-content"><divclass="row"><divclass="col-xs-12 col-sm-5"><divclass="quick-image"><divclass="single-quick-image tab-content text-center">                                                    @{
                                                        var productConfigImages = productConfigList.Where(r => r.ConfigType == "Image").ToList();
                                                        for (int i = 0; i <productConfigImages.Count;i++){varproductConfigImage = productConfigImages[i];<div class="tab-pane  fade in @(i==0?"active":"")" id="sin-pro-@(i)"><imgsrc="@(productConfigImage.ConfigValue)"alt=""></div>                                                        }
                                                    }
</div><divclass="quick-thumb"><divclass="nav nav-tabs"><ulstyle="padding-left:0px;">                                                            @{
                                                                for (int i = 0; i <productConfigImages.Count;i++){varproductConfigImage = productConfigImages[i];<li><adata-toggle="tab"href="##"onclick="javascript:tabProductImage('sin-pro-@(i)',this);"><imgsrc="@(productConfigImage.ConfigName)"alt="quick view"style="width:90px;height:90px;"></a></li>                                                                }
                                                            }
</ul></div></div></div></div><divclass="col-xs-12 col-sm-7"><divclass="quick-right"><divclass="quick-right-text"><h3><strong>@product.Name</strong></h3><divclass="rating"><iclass="fa fa-star"></i><iclass="fa fa-star"></i><iclass="fa fa-star"></i><iclass="fa fa-star-half-o"></i><iclass="fa fa-star-o"></i></div><divclass="amount"><h4>$@product.PreferentialPrice</h4></div><p>@product.Description</p><divclass="row m-p-b"><divclass="col-sm-12"><divclass="por-dse responsive-strok clearfix"><ul><li><span>是否现货</span><strong>:</strong> 现货</li><li><span>是否新品</span><strong>:</strong> 新品</li><li><span>商品类型</span><strong>:</strong><ahref="">@product.BasicStyle</a><ahref="">@product.ProductStyle</a></li></ul></div></div></div><divclass="row m-p-b"><divclass="col-sm-12"><divclass="por-dse color"><ul><li><span>颜色分类</span><strong>:</strong><divclass="por-dsc-div">                                                                            @{
                                                                                var productColors = productConfigList.Where(r => r.ConfigType == "Color").ToList();
                                                                                for (int i = 0; i <productColors.Count;i++){<span class="por-dsc-span" onclick="javascript:checkActive(this,'color');">@(productColors[i].ConfigValue)</span>                                                                                }
                                                                            }
</div></li><li><span>大小</span><strong>:</strong><divclass="por-dsc-div">                                                                            @{
                                                                                var productSizes = productConfigList.Where(r => r.ConfigType == "Size").ToList();
                                                                                for (int i = 0; i <productSizes.Count;i++){<span class="por-dsc-span" onclick="javascript:checkActive(this,'size');">@(productSizes[i].ConfigValue)</span>                                                                                }
                                                                            }
</div></li><li><span>标签</span><strong>:</strong><ahref="">@product.BasicStyle</a><ahref="">@product.ProductStyle</a></li></ul></div></div></div><divclass="dse-btn"><divclass="row"><divclass="col-sm-12 col-md-12"><divclass="por-dse clearfix"><ul><liclass="share-btn clearfix"><span>数量</span><inputclass="input-text qty"name="quantity"maxlength="12"value="1"title="数量"type="text"></li></ul></div></div><divclass="col-sm-12 col-md-12"><divclass="por-dse add-to"style="display:inline-block"><ahref="##"onclick="javascript:addCartByForm();">加入购物车</a></div><divclass="por-dse add-to"style="display:inline-block"><ahref="##"onclick="javascript:addPurchaseByForm();">立即购买</a></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><!-- quick view end --></form></div><scriptsrc="~/js/shop.js"></script>

 

商品详情页面展示

 

运行程序,在首页或商品列表页面,点击商品链接,进入商品详情页面,如下所示:

以上就是ASP.NET Core MVC开发实战之商城系统第四部分内容,后续将继续介绍其他模块,敬请期待。

相关文章
|
4天前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
5天前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
17 3
|
26天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
27 7
|
26天前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
26天前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
2月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
65 7
|
2月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
66 2
|
2月前
|
供应链 前端开发 Java
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
该博客文章介绍了一个使用Mybatis、Layui、MVC和JSP技术栈开发的服装库存管理系统,包括注册登录、权限管理、用户和货号管理、库存管理等功能,并提供了源码下载链接。
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
|
25天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
38 0
|
2月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
67 0
下一篇
无影云桌面