返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo

[索引页]
[源码下载]


返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo


作者:webabcd


介绍
以Northwind为示例数据库,使用asp.net mvc 1.0实现添加操作、查询操作、更新操作和删除操作


示例
1、Model(使用ADO.NET Entity Framework做ORM)
CategorySystem.cs(业务逻辑
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVC.Models 

        /**//// <summary> 
        /// MVC 之 Model 
        /// Category 业务层逻辑 
        /// </summary> 
        public class CategeorySystem 
        { 
                // Northwind 的 ObjectContext 
NorthwindEntities ctx = new NorthwindEntities() NorthwindEntities ctx = new NorthwindEntities(); 

                /**//// <summary> 
                /// 获取 Category 列表 
                /// </summary> 
                /// <returns></returns> 
List<Categories> GetCategory() List<Categories> GetCategory() 
                { 
                        return ctx.Categories.ToList(); 
                } 

                /**//// <summary> 
                /// 获取 Category 实体 
                /// </summary> 
                /// <param name="categoryId">类别 ID</param> 
                /// <returns></returns> 
Categories GetCategory() Categories GetCategory(int categoryId) 
                { 
                        return ctx.Categories.FirstOrDefault(p => p.CategoryID == categoryId); 
                } 
        } 


ProductSystem.cs(业务逻辑
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVC.Models 

        /**//// <summary> 
        /// MVC 之 Model 
        /// Product 业务层逻辑 
        /// </summary> 
        public class ProductSystem 
        { 
                // // Northwind 的 ObjectContext 
NorthwindEntities ctx = new NorthwindEntities() NorthwindEntities ctx = new NorthwindEntities(); 

                /**//// <summary> 
                /// 获取产品列表 
                /// </summary> 
                /// <param name="pageIndex">页索引</param> 
                /// <param name="pageSize">页大小</param> 
                /// <returns></returns> 
List<Products> GetProduct() List<Products> GetProduct(int pageIndex, int pageSize) 
                { 
                        return ctx.Products.OrderBy(p => p.ProductID).Skip(pageIndex * pageSize).Take(pageSize).ToList(); 
                } 

                /**//// <summary> 
                /// 获取产品 
                /// </summary> 
                /// <param name="productId">产品 ID</param> 
                /// <returns></returns> 
Products GetProduct() Products GetProduct(int productId) 
                { 
                        return ctx.Products.FirstOrDefault(p => p.ProductID == productId); 
                } 

                /**//// <summary> 
                /// 新增产品 
                /// </summary> 
                /// <param name="product">产品的 Entity</param> 
void AddProduct() void AddProduct(Products product) 
                { 
                        ctx.AddToProducts(product); 
                } 

                /**//// <summary> 
                /// 删除产品 
                /// </summary> 
                /// <param name="product">产品的 Entity</param> 
void DeleteProduct() void DeleteProduct(Products product) 
                { 
                        product.Order_Details.Load(); 
                        ctx.DeleteObject(product); 
                } 

                /**//// <summary> 
                /// 在此对象的上下文中保存修改(增/删/改的操作) 
                /// </summary> 
void Save() void Save() 
                { 
                        ctx.SaveChanges(); 
                } 

                /**//// <summary> 
                /// 在此对象的上下文中创建 EntityKey 
                /// </summary> 
                /// <param name="entitySetName">实体集的名称</param> 
                /// <param name="entity">实体</param> 
                /// <returns></returns> 
System.Data.EntityKey CreateEntityKey() System.Data.EntityKey CreateEntityKey(string entitySetName, object entity) 
                { 
                        return ctx.CreateEntityKey(entitySetName, entity); 
                } 
        } 
}

ValidationEntity.cs(合法性验证)
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVC.Models 

        /**//// <summary> 
        /// 验证信息的实体 
        /// </summary> 
        public class ValidationEntity 
        { 
                /**//// <summary> 
                /// 验证的错误信息 
                /// </summary> 
                public string ErrorMessage { getset; } 
                /**//// <summary> 
                /// 产生错误信息的属性名称 
                /// </summary> 
                public string PropertyName { getset; } 
                 
ValidationEntity() ValidationEntity(string errorMessage) 
                { 
                        ErrorMessage = errorMessage; 
                } 

ValidationEntity() ValidationEntity(string errorMessage, string propertyName) 
                { 
                        ErrorMessage = errorMessage; 
                        PropertyName = propertyName; 
                } 
        } 
}

Product.cs(合法性验证)
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVC.Models 

        /**//// <summary> 
        /// 扩展 Product 实体 
        /// 主要是为了对 Product 实体的各个属性做输入的合法性验证 
        /// </summary> 
        public partial class Products 
        { 
                List<ValidationEntity> info = new List<ValidationEntity>(); 

                /**//// <summary> 
                /// 对 Product 实体所做的修改是否通过了合法性验证 
                /// </summary> 
                public bool IsValid 
                { 
                        get    
                        { 
                                return GetValidation().Count() == 0; 
                        } 
                } 
                 
                /**//// <summary> 
                /// 返回验证信息列表 
                /// </summary> 
                /// <returns></returns> 
List<ValidationEntity> GetValidation() List<ValidationEntity> GetValidation() 
                { 
                        return info; 
                } 

                /**//// <summary> 
                /// 重写部分方法 OnProductNameChanging 
                /// 用于在 ProductName 属性改变前,对其做合法性验证 
                /// </summary> 
                /// <param name="value"></param> 
                partial void OnProductNameChanging(string value) 
                { 
                        if (string.IsNullOrEmpty(value)) 
                                info.Add(new ValidationEntity("请输入产品名称""ProductName")); 
                } 

                /**//// <summary> 
                /// 重写部分方法 OnUnitPriceChanging 
                /// 用于在 UnitPrice 属性改变前,对其做合法性验证 
                /// </summary> 
                /// <param name="value"></param> 
                partial void OnUnitPriceChanging(global::System.Nullable<decimal> value) 
                { 
                        if (value == null
                                info.Add(new ValidationEntity("请输入单价""UnitPrice")); 
                        else if (((decimal)value) > 100) 
                                info.Add(new ValidationEntity("输入的单价过高""UnitPrice")); 
                } 
        } 
}


2、Controller
ProductController.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Mvc.Ajax; 

using MVC.Models; 

namespace MVC.Controllers 

        /**//// <summary> 
        /// MVC 之 Controller 
        /// 这里体现了 Convention over Configuration 
        /// Controller 类必须以字符串 Controller 做类名称的结尾,字符串 Controller 之前的字符串为 Controller 的名称,类中的方法名为 Action 的名称 
        /// 例如 ProductController, Controller 的名称为:Product;其中的 Action 名称有 Index, Details, Edit 等 
        /// </summary> 
        public class ProductController : Controller // 需要继承自 System.Web.Mvc.Controller 或者实现 IController 接口 
        { 
                ProductSystem ps = new ProductSystem(); 

                // Action 的返回值必须为 ActionResult 或 void    

                /**//// <summary> 
                /// 获取 Product 的列表 
                /// </summary> 
                /// <param name="pageIndex">页索引</param> 
                /// <returns></returns> 
ActionResult Index() ActionResult Index(int pageIndex) 
                { 
                        int pageSize = 10; 
                        var products = ps.GetProduct(pageIndex, pageSize); 

                        // 此 Action 对应的 View 为(按查找的先后顺序) Views/Product/Index.aspx, Views/Product/Index.ascx, Views/Shared/Index.aspx, Views/Shared/Index.ascx 
                        // 其所对应的 View 的关联对象为 products 
                        return View("Index", products); 
                } 

ActionResult Details() ActionResult Details(int id) 
                { 
                        var product = ps.GetProduct(id); 

                        if (product == null
                                return View("NotFound"); 
                        else 
                                // 对应的 View 的名称默认为 Action 的名称,所以此处所对应的 View 的名称为 Details 
                                return View(product); 
                } 

ActionResult Edit() ActionResult Edit(int id) 
                { 
                        var product = ps.GetProduct(id); 

                        if (product == null
                        { 
                                return View("NotFound"); 
                        } 
                        else 
                        { 
                                product.CategoriesReference.Load(); 

                                // 编辑 Product 的时候需要在一个 DropDownList 中选择其所对应的 Category, 所以这里要构造一个名为 CategoryAll 的 ViewData 
                                // 因为 Categories 已经是 Product 的属性了,所以这里的 ViewData 的 key 不能为 Categories 
                                if (product.Categories == null
                                        ViewData["CategoryAll"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId""CategoryName"); 
                                else 
                                        ViewData["CategoryAll"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId""CategoryName", product.Categories.CategoryID); 

                                return View("Edit", product); 
                        } 
                } 

                // 可以用 AcceptVerbs 来声明 Action 所对应的 http 方法 
                [AcceptVerbs(HttpVerbs.Post)] 
ActionResult Edit() ActionResult Edit(int id, FormCollection formValues) 
                { 
                        var product = ps.GetProduct(id); 

                        // 可以通过这种方式一一为 Product 对象的属性赋值 
                        // product.ProductName = Request.Form["ProductName"]; 

                        // 也可以通过 UpdateModel, 让系统自动为属性赋值(通过反射的方式,取得对象的属性名称,然后和 Request 的 key 做匹配,匹配成功的则赋值) 
                        UpdateModel<Products>(product); 

                        var category = new CategeorySystem().GetCategory(int.Parse(Request.Form["MyCategory"])); 
                        product.CategoriesReference.EntityKey = ps.CreateEntityKey("Categories", category); 

                        // 通过以下的方式让 UpdateModel 只更新指定属性 
                        // string[] allowedProperties = new[] { "ProductName""UnitPrice" }; 
                        // UpdateModel(product, allowedProperties); 

                        if (!product.IsValid) 
                        { 
                                foreach (var validation in product.GetValidation()) 
                                { 
                                        // 设置验证信息 
                                        ModelState.AddModelError(validation.PropertyName, validation.ErrorMessage); 
                                } 

                                if (product.Categories == null
                                        ViewData["CategoryAll"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId""CategoryName"); 
                                else 
                                        ViewData["CategoryAll"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId""CategoryName", product.Categories.CategoryID); 

                                return View(product); 
                        } 

                        ps.Save(); 

                        // 跳转到指定的 Action 
                        return RedirectToAction("Details"new { id = product.ProductID }); 
                } 

ActionResult Create() ActionResult Create() 
                { 
                        Products product = new Products() 
                        { 
                                ProductName = "请输入产品名称" 
                        }; 

                        return View(product); 
                } 

                // 可以为参数添加声明,如下例:[Bind(Include = "ProductName")],客户端提交的数据中,只有 ProductName 会被绑定到 Product 对象上 
                // [Bind(Include = "ProductName")] 这样的 attribute 也可以声明在类上,用于指定类中需要被绑定的属性 
                [AcceptVerbs(HttpVerbs.Post)] 
ActionResult Create() ActionResult Create([Bind(Include = "ProductName")] Products product) 
                { 
                        if (!product.IsValid) 
                        { 
                                foreach (var issue in product.GetValidation()) 
                                { 
                                        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
                                } 

                                return View(product); 
                        } 

                        ps.AddProduct(product); 
                        ps.Save(); 

                        return RedirectToAction("Details"new { id = product.ProductID }); 
                } 

ActionResult Delete() ActionResult Delete(int id) 
                { 
                        var product = ps.GetProduct(id); 

                        if (product == null
                                return View("NotFound"); 
                        else 
                                return View(product); 
                } 

                [AcceptVerbs(HttpVerbs.Post)] 
ActionResult Delete() ActionResult Delete(int id, string confirmButton) 
                { 
                        var product = ps.GetProduct(id); 

                        if (product == null
                                return View("NotFound"); 

                        ps.DeleteProduct(product); 
                        ps.Save(); 

                        return View("Deleted"); 
                } 
        } 
}


3、View(以列表页为例)
Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"
        Index 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"
        <h2> 
                Index</h2> 
        <table> 
                <tr> 
                        <th> 
                        </th> 
                        <th> 
                                ProductID 
                        </th> 
                        <th> 
                                ProductName 
                        </th> 
                        <th> 
                                UnitPrice 
                        </th> 
                </tr> 
                <%    // 因为本页集成了 System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>> 
                        // 所以这里的 Model 就是 System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>> 的 Model 属性 
                        foreach (var item in Model) 
                        { %> 
                <tr> 
                        <td> 
                                <!--这里的 Html 属性类型为 System.Web.Mvc.HtmlHelper--> 
                                <%= Html.ActionLink("Delete""Delete"new { id = item.ProductID })%> 
                                | 
                                <%= Html.ActionLink("Edit""Edit"new { id = item.ProductID }) %> 
                        </td> 
                        <td> 
                                <%= Html.ActionLink(item.ProductID.ToString(), "Details"new { id=item.ProductID })%> 
                        </td> 
                        <td> 
                                <%= Html.Encode(item.ProductName) %> 
                        </td> 
                        <td> 
                                <%= Html.Encode(String.Format("{0:F}", item.UnitPrice)) %> 
                        </td> 
                </tr> 
                <% } %> 
        </table> 
        <p> 
                <%= Html.RouteLink("上一页""Products"new { pageIndex = Convert.ToInt32(Html.ViewContext.RouteData.Values["pageIndex"]) - 1 })%> 
                | 
                <%= Html.RouteLink("下一页""Products"new { pageIndex = Convert.ToInt32(Html.ViewContext.RouteData.Values["pageIndex"]) + 1 })%> 
        </p> 
</asp:Content>



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341599,如需转载请自行联系原作者

上一篇:阿里李运华:异地多活有哪些Impossible Mission?


下一篇:企业应对恶意勒索软件有新招:大量存储比特币