热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第8章SportsStorePeta导航

一、添加导航控制1.过滤产品列表增强ProductsListViewModelpublicclassProductsListViewModel{p

一、添加导航控制

  1.过滤产品列表 

    增强ProductsListViewModel

 public class ProductsListViewModel
{
public IEnumerable Products { get; set; }
public PageInfo PagingInfo { get; set; }
public string CurrentCategory { get; set; }
}

    修改List动作方法    

 public ViewResult List(string category,int page=1)
{

ProductsListViewModel model
= new ProductsListViewModel
{
Products
= GetProductViewModelListByProducts( _repository.Products.Where(p=>category==null||p.Category==category).OrderBy(p => p.ProductId).Skip((page - 1)*PageSize).Take(PageSize)),
PagingInfo
= new PageInfo { CurrentPage = page,ItemsPerPage = PageSize,TotalItems = _repository.Products.Count()} ,
CurrentCategory
= category

};

return View(model);
}
 

  2.调整URL方案(修改路由)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
null, "", new {cOntroller= "Product", action = "List", category = (string) null, page = 1});

routes.MapRoute(
null, "Page{page}", new { cOntroller= "Product", action = "List", category = (string)null},new{page=@"\d+"});

routes.MapRoute(
null, "{category}", new { cOntroller= "Product", action = "List", page = 1 });

routes.MapRoute(
null, "{category}/Page{page}", new { cOntroller= "Product", action = "List" },new{page=@"\d+"});

routes.MapRoute(
null, "{controller}/{action}");

    修改分布链接添加分页信息    

<div class="pager">
@Html.PageLinks(Model.PagingInfo,x=>Url.Action("List",new{page=x,category=Model.CurrentCategory}))
div>

  3.建立分类导航菜单

    子动作:适用于创建诸如可重用导航控件之类的东西。依赖于“RenderAction”辅助器方法,在当前视图中包含一个任意动作方法的输出。

    (1)创建导航控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace SportsStorePeta.WebUI.Controllers
{
public class NavController : Controller
{
//
// GET: /Nav/
public string Menu()
{
return "Hello from NavController";
}

}
}

    修改布局:

  RenderAction方法会将它的内容直接写入到响应流,必须把这个调用封装在一个Razor代码块中,而且以分号为语句结束。@{Html.RenderAction("Menu","Nav");}

<div id="categories">
@{
Html.RenderAction("Menu","Nav");
}
div>

    (2)生成分类列表

using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStorePeta.Domain.Abstract;

namespace SportsStorePeta.WebUI.Controllers
{
public class NavController : Controller
{
private readonly IProductRepository _repository;

public NavController(IProductRepository repo)
{
_repository
= repo;
}

public PartialViewResult Menu()
{
IEnumerable
<string> categories = _repository.Products.Select(x => x.Category).Distinct().OrderBy(x => x);
return PartialView(categories);
}

}
}

    (3)创建分部视图 Menu

@model IEnumerable<string>
@Html.ActionLink("Home","List","Product")

@foreach (var link in Model)
{
@Html.RouteLink(link,new{cOntroller="Product",action="List",category=link,page=1})
}

    用于分类链接的CSS

div#categories a {
font
: bold 1.1em "Arial Narrow", "Franklin Gothic medium", Arial;display: block;
text-decoration
: none;padding: .6em;color: black;
border-bottom
: 1px solid silver;
}

div#categories a.selected
{
background-color
: #666;color: white;
}

    高亮当前分类  

 public PartialViewResult Menu(string category=null)
{
ViewBag.SelectedCategory
= category;
IEnumerable
<string> categories = _repository.Products.Select(x => x.Category).Distinct().OrderBy(x => x);
return PartialView(categories);
}
@model IEnumerable<string>
@Html.ActionLink("Home","List","Product")

@foreach (var link in Model)
{
@Html.RouteLink(link, new { cOntroller= "Product", action = "List", category = link, page = 1 },
new { @class=link==ViewBag.SelectedCategory?"selected":null}

)
}

  4.修正页面计数

  public ProductController(IProductRepository productRepository)
{
_repository
= productRepository;
}

public ViewResult List(string category,int page=1)
{

ProductsListViewModel model
= new ProductsListViewModel
{
Products
= GetProductViewModelListByProducts( _repository.Products.Where(p=>category==null||p.Category==category).OrderBy(p => p.ProductId).Skip((page - 1)*PageSize).Take(PageSize)),
PagingInfo
= new PageInfo { CurrentPage = page,ItemsPerPage = PageSize,TotalItems =category==null?_repository.Products.Count():_repository.Products.Count(e => e.Category==category)} ,
CurrentCategory
= category
};

return View(model);
}

二、建立购物车

  1.定义购物车实体

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

namespace SportsStorePeta.Domain.Entities
{
public class Cart
{
private List lineCollection = new List();

public void AddItem(Product product, int quantity)
{
CartLine line
= lineCollection.FirstOrDefault(p => p.Product.ProductId == product.ProductId);
if (line == null)
{
lineCollection.Add(
new CartLine{Product = product,Quantity = quantity});
}
else
{
line.Quantity
+= quantity;
}
}

public void RemoveLine(Product product)
{
lineCollection.RemoveAll(l
=> l.Product.ProductId == product.ProductId);
}

public decimal ComputeTotalValue()
{
return lineCollection.Sum(e => e.Product.Price*e.Quantity);
}

public void Clear()
{
lineCollection.Clear();
}

public IEnumerable Lines{get { return lineCollection; }}
}

public class CartLine
{
public Product Product { get; set; }
public int Quantity { get; set; }
}
}

  2.添加按钮“加入购物车”

@model SportsStorePeta.WebUI.Models.ProductViewModel

<div class="item">
<h3>@Model.Nameh3>
@Model.Description
@using (Html.BeginForm("AddToCart", "Cart"))
{
@Html.HiddenFor(x=>x.ProductId)
@Html.Hidden("returnUrl",Request.Url.PathAndQuery)
<input type="submit" value="加入购物车"/>
}
<h4>@Model.Priceh4>
div>

    在Site.css中设置按钮样式   

form {
margin
: 0;padding: 0;
}

div.item form
{ float: right;}
div.item input
{
color
: white;background: #333;border: 1px solid black;cursor: pointer;
}

  3.实现购物车控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStorePeta.Domain.Abstract;
using SportsStorePeta.Domain.Entities;

namespace SportsStorePeta.WebUI.Controllers
{
public class CartController : Controller
{
private IProductRepository _repository;

public CartController(IProductRepository repo)
{
_repository
= repo;
}

public RedirectToRouteResult AddToCart(int productId, string returnUrl)
{
Product product
= _repository.Products.FirstOrDefault(p => p.ProductId == productId);
if (product != null)
{
GetCart().AddItem(product,
1);
}
return RedirectToAction("Index", new {returnUrl});
}

public RedirectToRouteResult RemoveFromCart(int productId, string returnUrl)
{
Product product
= _repository.Products.FirstOrDefault(p => p.ProductId == productId);
if (product != null)
{
GetCart().RemoveLine(product);
}
return RedirectToAction("Index", new { returnUrl });
}

private Cart GetCart()
{
Cart cart
= (Cart) Session["Cart"];
if (cart == null)
{
cart
= new Cart();
Session[
"Cart"] = cart;
}
return cart;
}

}
}

  4.显示购物车内容

    添加CartIndexViewModel视图模型类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SportsStorePeta.Domain.Entities;

namespace SportsStorePeta.WebUI.Models
{
public class CartIndexViewModel
{
public Cart Cart { get; set; }
public string ReturnUrl { get; set; }
}
}

  CartController中添加Index动作方法:

      public ViewResult Index(string returnUrl)
{
return View(new CartIndexViewModel {Cart = GetCart(), ReturnUrl = returnUrl});
}

  添加Index视图:

@model SportsStorePeta.WebUI.Models.CartIndexViewModel

@{
ViewBag.Title = "我的购物车";
}
<h2>我的购物车h2>
<table width="90%" align="center">
<thead>
<tr>
<th align="left">物品th>
<th align="center">数量th>
<th align="right">单价th>
<th align="right">金额th>
tr>
thead>
<tbody>
@foreach (var line in Model.Cart.Lines)
{
<tr>
<td align="left">@line.Product.Nametd>
<td align="center">@line.Quantitytd>
<td align="right">@line.Product.Price.ToString("c")td>
<td align="right">@((line.Quantity*line.Product.Price).ToString("c"))td>
tr>
}
tbody>
<tfoot>
<tr>
<td colspan="3" align="right">合计td>
<td align="right">@Model.Cart.ComputeTotalValue().ToString("c")td>
tr>
tfoot>
table>

<p align="center" class="actionButtons">
<a href="@Model.ReturnUrl">继续购物a>
p>

  Css样式:

h2{margin-top: 0.3em}

tfoot td
{
border-top
: 1px dotted gray;font-weight: bold;
}

.actionButtons a,input.actionButtons
{
font
: .8em Arial;color: white;margin: .5em;
text-decoration
: none;padding: .15em 1.5em .2em 1.5em;
background-color
: #353535;border: 1px solid black;
}

源码:http://yunpan.cn/cdg5yKnzmH3dF 访问密码 7d00


推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • ECharts 官方提供了丰富的图表示例,但实际项目中往往需要从后端动态获取数据。本文将详细介绍如何从后端获取数据并将其转换为 ECharts 所需的 JSON 格式,以实现动态饼图的展示。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文介绍了如何将包含复杂对象的字典保存到文件,并从文件中读取这些字典。 ... [详细]
author-avatar
北漂123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有