第10章 SportsStorePeta 管理

一、添加分类管理

  1.创建CRUD控制器

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

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

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

        public ViewResult Index()
        {
            return View(_repository.Products);
        }

    }
}

  2.创建新布局(_AdminLoyout.cshtml)

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/Content/Admin.css" rel="stylesheet" type="text/css"/>
    <title>@ViewBag.Title</title>

</head>
<body>
    <div>
        @RenderBody()
    </div>
</body>
</html>

    新建Admin.CSS

  

body ,td {
    font-family: Segoe UI, Verdana;
}
h1 {
    padding: .5em;padding-top: 0;font-weight: bold;
    font-size: 1.5em;border-bottom: 2px solid gray;
}

div#content{ padding: .9em;}
table.grid td,table.grid th {
    border-bottom: 1px dotted gray;text-align: left;
}

table.grid {
    border-collapse: collapse;width: 100%;
}

table.grid th.NumericCol,table.grid td.NumericCol {
    text-align: right;padding-right: 1em;
}

form{ margin-bottom: 0px;}

div.Message {
    background: gray;color: white;padding: .2em;margin-top: .25em;
}

/* Styles for validation helpers
-----------------------------------------------------------*/
.field-validation-error {
    color: #f00;display: block;
}

.field-validation-valid {
    display: none;
}

.input-validation-error {
    border: 1px solid #f00;
    background-color: #ffeeee;
}

.validation-summary-errors {
    font-weight: bold;
    color: #f00;
}

.validation-summary-valid {
    display: none;
}

  3.实现List视图Admin/Index 

@using SportsStorePeta.Domain.Entities
@model IEnumerable<SportsStorePeta.Domain.Entities.Product>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_AdminLoyout.cshtml";
}

<h2>Index</h2>
<P>
    @Html.ActionLink("新建", "Create")
</P>
<table>
    <thead>
    <tr>
        <th>@Html.DisplayNameFor(m => m.Name)</th>
        <th>@Html.DisplayNameFor(m => m.Description)</th>
        <th>@Html.DisplayNameFor(m => m.Price)</th>
        <th>@Html.DisplayNameFor(m => m.Category)</th>
        <th></th>
    </tr>
    </thead>
    <tbody>
        @foreach (Product item in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.Name)</td>
                <td>@Html.DisplayFor(modelItem => item.Description)</td>
                <td>@Html.DisplayFor(modelItem => item.Price)</td>
                <td>@Html.DisplayFor(modelItem => item.Category)</td>
                <td>
                    @Html.ActionLink("修改", "Edit", new {id = item.ProductId})|
                    @Html.ActionLink("详细", "Details", new {id = item.ProductId})|
                    @Html.ActionLink("删除","Delete",new{id=item.ProductId})
                </td>
            </tr>
        }
    </tbody>
</table>

   紧凑型视图:  

@using SportsStorePeta.Domain.Entities
@model IEnumerable<SportsStorePeta.Domain.Entities.Product>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_AdminLoyout.cshtml";
}

<h2>所有产品</h2>

<table class="grid">
    <thead>
    <tr>
        <th>序号</th>
        <th>名称</th>
        <th class="NumericCol">价格</th>
        <th>删除</th>
        <th></th>
    </tr>
    </thead>
    <tbody>

    @{ int i = 0;}
    @foreach (Product item in Model)
    {
        i = i + 1;
         <tr>
            <td>@i</td>
            <td>@Html.ActionLink(item.Name, "Edit", new {item.ProductId})</td>
            <td class="NumericCol">@item.Price.ToString("C")</td>
            <td>
                @using (Html.BeginForm("Delete", "Admin"))
                {
                    @Html.Hidden("ProductId", item.ProductId)
                    <input type="submit" value="删除"/>
                }
            </td>
        </tr>
    }
    </tbody>
</table>
<P>
    @Html.ActionLink("新建", "Create")
</P>

  4.编辑产品

    创建Edit动作方法

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 AdminController : Controller
    {
        private IProductRepository _repository;

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

        public ViewResult Index()
        {
            return View(_repository.Products);
        }

        public ViewResult edit(int productId)
        {
            Product product = _repository.Products.FirstOrDefault(p => p.ProductId == productId);
            return View(product);
        }
    }
}

    创建Edit视图  

@model SportsStorePeta.Domain.Entities.Product

@{
    ViewBag.Title = "Admin 编辑 "[email protected];
    Layout = "~/Views/Shared/_AdminLoyout.cshtml";
}

<h2>编辑 @Model.Name</h2>
@using (Html.BeginForm())
{
    @Html.EditorForModel()
    <input type="submit" value="保存"/>
    @Html.ActionLink("取消并返回列表","Index")
}

  对ORM模型类添加注解属性: 

[MetadataType(typeof(ProductMetaData))]
    public partial class Product : DbContextDB.Record<Product>
    {
      ...
     }

  添加Product类的注解属性类:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace SportsStorePeta.Domain.Entities
{
    public partial class ProductMetaData
    {
        [HiddenInput(DisplayValue = false)]
        public int ProductId { get; set; }

        [Display(Name = "产品名称")]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        [Display(Name = "描述")]
        public string Description { get; set; }

        [Display(Name = "类别")]
        public string Category { get; set; }

        [Display(Name = "价格")]
        public decimal Price { get; set; }

    }
}

    添加CSS样式  

.editor-field{ margin-bottom: .8em;}
.editor-label{ font-weight: bold;}
.editor-label:after{content: ":"}
.text-box{ width: 25em;}
.multi-line {
    height: 5em;font-family: Segoe UI, Verdana;
}

    更新产品存储库  

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

namespace SportsStorePeta.Domain.Abstract
{
   public interface IProductRepository
    {
       IQueryable<Product> Products { get; }
       void SaveProduct(Product product);
    }
}

   实现SaveProduct方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SportsStorePeta.Domain.Abstract;
using SportsStorePeta.Domain.Entities;

namespace SportsStorePeta.Domain.Concrete
{
   public class PpProductRepository :IProductRepository
    {
       private readonly PpContext _context=new PpContext();
       public IQueryable<Product> Products
       {
           get { return _context.Products; }
       }

       public void SaveProduct(Product product)
       {
           _context.Save(product);  //自动判断新增、修改
       }
    }
}

  处理Edit的Post请求  

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 AdminController : Controller
    {
        private IProductRepository _repository;

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

        public ViewResult Index()
        {
            return View(_repository.Products);
        }

        public ViewResult Edit(int productId)
        {
            Product product = _repository.Products.FirstOrDefault(p => p.ProductId == productId);
            return View(product);
        }

        [HttpPost]
        public ActionResult Edit(Product product)
        {
            if (ModelState.IsValid)
            {
                _repository.SaveProduct(product);
                TempData["message"] = string.Format("{0} 已经保存。", product.Name);
                return RedirectToAction("Index");
            }
            else
            {
                return View(product);
            }
        }
    }
}

  显示确认消息  

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/Content/Admin.css" rel="stylesheet" type="text/css"/>
    <title>@ViewBag.Title</title>

</head>
<body>
<div>
    @if (TempData["message"] != null)
    {
        <div class="Message">@TempData["message"]</div>
    }
    @RenderBody()
</div>
</body>
</html> 

    添加模型验证

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace SportsStorePeta.Domain.Entities
{
    public partial class ProductMetaData
    {
        [HiddenInput(DisplayValue = false)]
        public int ProductId { get; set; }

        [Display(Name = "产品名称")]
        [Required(ErrorMessage = "请输入产品名称")]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        [Display(Name = "描述")]
        [Required(ErrorMessage = "请输入产品描述")]
        public string Description { get; set; }

        [Display(Name = "类别")]
        [Required(ErrorMessage = "请指定产品类别")]
        public string Category { get; set; }

        [Display(Name = "价格")]
        [Required]
        [Range(0.01,Double.MaxValue,ErrorMessage = "请输入真实的价格")]
        public decimal Price { get; set; }

    }
}

    启用客户端验证  

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/Content/Admin.css" rel="stylesheet" type="text/css"/>
    <script src="~/Scripts/jquery-1.8.2.min.js"></script>
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    <title>@ViewBag.Title</title>

</head>
<body>
<div>
    @if (TempData["message"] != null)
    {
        <div class="Message">@TempData["message"]</div>
    }
    @RenderBody()
</div>
</body>
</html>

5.创建新产品

    添加Create 动作方法  

        public ViewResult Create()
        {
            return View("Edit", new Product());
        }

    修改共用的Edit视图  

@model SportsStorePeta.Domain.Entities.Product

@{
    ViewBag.Title = "Admin 编辑 "[email protected];
    Layout = "~/Views/Shared/_AdminLoyout.cshtml";
}

<h2>编辑 @Model.Name</h2>
@using (Html.BeginForm("Edit","Admin"))
{
    @Html.EditorForModel()
    <input type="submit" value="保存"/>
    @Html.ActionLink("取消并返回列表","Index")
}

  6.删除产品

    接口添加删除方法

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

namespace SportsStorePeta.Domain.Abstract
{
   public interface IProductRepository
    {
       /// <summary>
       /// 获得产品集合
       /// </summary>
       IQueryable<Product> Products { get; }
       /// <summary>
       /// 产品信息修改保存
       /// </summary>
       /// <param name="product"></param>
       void SaveProduct(Product product);

       /// <summary>
       /// 删除产品
       /// </summary>
       /// <param name="productId"></param>
       /// <returns></returns>
       Product DeleteProduct(int productId);
    }
}

    实体框架删除方法实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SportsStorePeta.Domain.Abstract;
using SportsStorePeta.Domain.Entities;

namespace SportsStorePeta.Domain.Concrete
{
   public class PpProductRepository :IProductRepository
    {
       private readonly PpContext _context=new PpContext();
       public IQueryable<Product> Products
       {
           get { return _context.Products; }
       }

       public void SaveProduct(Product product)
       {
           _context.Save(product);  //自动判断新增、修改
       }

       public Product DeleteProduct(int productId)
       {
           Product dbProduct = _context.FirstOrDefault<Product>("Where [email protected]",
               new {ProductId = productId});
           if (dbProduct != null)
           {
               _context.Delete<Product>(dbProduct);
           }
           return dbProduct;
       }
    }
}

    添加Delete动作方法

        [HttpPost]
        public ActionResult Delete(int productId)
        {
            Product deleteProduct = _repository.DeleteProduct(productId);
            if (deleteProduct != null)
            {
                TempData["message"] = string.Format("{0} 已经被删除。", deleteProduct.Name);
            }
            return RedirectToAction("Index");
        }

源码:http://yunpan.cn/cdAUcvqdNaLAx 访问密码 65f3

时间: 2024-10-07 15:29:16

第10章 SportsStorePeta 管理的相关文章

【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

[翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第三部分) . . .

Django第10章: 权限管理(递归菜单树)

权限四表(重点) 用户登录 进入admin后台填充数据; 前端利用form表单登录; 用户输入登录信息后, 若后端认证通过,则缓存当前用户的所有权限信息 # views.py============================================ def login(request): if request.method == 'GET': return render(request, 'login.html') else: username = request.POST.get

第10章,程序包管理学习笔记

更多内容请点击: Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) http://blog.51cto.com/13683480/2095439 笔记整理开始时间:2018年4月20日14:07:22 第10章  程序包管理 本章内容 软件运行环境 软件包基础 rpm包管理 yum管理 定制yum仓库 编译安装 软件运行和编译: ABI: Application Binary  Interface 应用程序的二进制接口 window:       PE,Por

读《构建之法》第8、9、10章有感

第8章  需求分析 软件需求 用户的需求五花八门,作为一个软件团队要准确而全面地获取这些需求主要有以下四个步骤: 获取和引导需求.这一步骤也被叫做“需求捕捉”.软件团队需要为用户着想,设身处地,为用户引导出需求. 分析和定义需求.从各个方面获取的需求进行规整,定义需求的内涵从各个角度将需求量化. 验证需求.软件团队要跟利益相关者沟通,通过分析报告.技术原型.用户调查或演示等形式向他们验证软件团队对于这些需求的认知. 在软件产品的生命周期中管理需求. 竞争性需求分析的框架:1.N(需求) 2.A(

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦 20章.战略管理1.企业战略的特点有哪些?P420-421 答:1).全局性 2).长远性 3).抗争性 4).纲领性 2.企业战略决策的特点有哪些?P421答:1).决策的对象是复杂的,很难把握住它的结构,并且是没有先例的,对其处理上也是没有经验可循. 2).面对的问题常常是突发性的.难以预料的.所依靠的是来自外部的关于未来如何变化的很少的情报. 3).决策的性质直接涉及到企业的前途. 4)

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

《构建之法》之第8、9、10章读后感

第8章 第8章主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 软件需求的步骤为:1.获取和引导需求(Elicitation); 2.分析与定义需求(Analysis&Specification); 3.验证需求(Validation); 4.在软件产品的生命周期中管理需求(Management). 获取用户需求——用户调查:1.焦点小组(Focus Group); 2.深入面谈(In-depth Int

《白帽子讲WEB安全》学习笔记之第10章 访问控制

第10章 访问控制 10.1 what can i do? 权限控制是值某个主体(身份)对某一个客体需要实施某种操作,而系统对这种操作的限制就是权限控制. 在一个安全系统中,确定主题的身份是"认证"解决的问题:而客体是胭脂红资源,是主题发起的请求对象.在主体对客体进行操作的过程,系统控制主体不能"无限制"地对客体进行操作,这过程就是"访问控制". 在WEB应用中,根据访问楷体的不同,常见的访问控制可以分为"基于URL的访问控制"

构建之法第四次作业(6,9,10章)

通过第6章的学习,我们了解到"敏捷流程”一词,他有以下一些原则 1.尽早并持续的交付有价值的软件以满足顾客需求. 2.敏捷流程欢迎需求的变化,并利用这种变化来提高用户的竞争优势的. 3.经常发布可用的软件,发布间隔可以从几周到几个月,能短则短. 4.业务人员和开发人员在项目开发过程中应该每天共同工作. 5.以有进取心的认为项目核心,充分支持信任他们. 6.无论团队内外,面对面的交流始终是最有效的沟通方式. 7.可用的软件是衡量项目进展的主要指标. 8.敏捷流程能保持可持续的发展.领导.团队和用户