Ajax返璞归真 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(业务逻辑)

Ajax 1using System;
Ajax 2using System.Collections.Generic;
Ajax 3using System.Linq;
Ajax 4using System.Web;
Ajax 5
Ajax 6namespace MVC.Models
Ajax 7Ajax 8Ajax 9{
Ajax 10Ajax 11    /**//// <summary>
Ajax 12    /// MVC 之 Model
Ajax 13    /// Category 业务层逻辑
Ajax 14    /// </summary>
Ajax 15    public class CategeorySystem
Ajax 16Ajax 17    Ajax 18{
Ajax 19        // Northwind 的 ObjectContext
Ajax 20        private NorthwindEntities ctx = new NorthwindEntities();
Ajax 21
Ajax 22Ajax 23        /**//// <summary>
Ajax 24        /// 获取 Category 列表
Ajax 25        /// </summary>
Ajax 26        /// <returns></returns>
Ajax 27        public List<Categories> GetCategory()
Ajax 28Ajax 29        Ajax 30{
Ajax 31            return ctx.Categories.ToList();
Ajax 32        }
Ajax 33
Ajax 34Ajax 35        /**//// <summary>
Ajax 36        /// 获取 Category 实体
Ajax 37        /// </summary>
Ajax 38        /// <param name=”categoryId”>类别 ID</param>
Ajax 39        /// <returns></returns>
Ajax 40        public Categories GetCategory(int categoryId)
Ajax 41Ajax 42        Ajax 43{
Ajax 44            return ctx.Categories.FirstOrDefault(p => p.CategoryID == categoryId);
Ajax 45        }
Ajax 46    }
Ajax 47}
Ajax 48

ProductSystem.cs(业务逻辑)

Ajax 49using System;
Ajax 50using System.Collections.Generic;
Ajax 51using System.Linq;
Ajax 52using System.Web;
Ajax 53
Ajax 54namespace MVC.Models
Ajax 55Ajax 56Ajax 57{
Ajax 58Ajax 59    /**//// <summary>
Ajax 60    /// MVC 之 Model
Ajax 61    /// Product 业务层逻辑
Ajax 62    /// </summary>
Ajax 63    public class ProductSystem
Ajax 64Ajax 65    Ajax 66{
Ajax 67        // // Northwind 的 ObjectContext
Ajax 68        private NorthwindEntities ctx = new NorthwindEntities();
Ajax 69
Ajax 70Ajax 71        /**//// <summary>
Ajax 72        /// 获取产品列表
Ajax 73        /// </summary>
Ajax 74        /// <param name=”pageIndex”>页索引</param>
Ajax 75        /// <param name=”pageSize”>页大小</param>
Ajax 76        /// <returns></returns>
Ajax 77        public List<Products> GetProduct(int pageIndex, int pageSize)
Ajax 78Ajax 79        Ajax 80{
Ajax 81            return ctx.Products.OrderBy(p => p.ProductID).Skip(pageIndex * pageSize).Take(pageSize).ToList();
Ajax 82        }
Ajax 83
Ajax 84Ajax 85        /**//// <summary>
Ajax 86        /// 获取产品
Ajax 87        /// </summary>
Ajax 88        /// <param name=”productId”>产品 ID</param>
Ajax 89        /// <returns></returns>
Ajax 90        public Products GetProduct(int productId)
Ajax 91Ajax 92        Ajax 93{
Ajax 94            return ctx.Products.FirstOrDefault(p => p.ProductID == productId);
Ajax 95        }
Ajax 96
Ajax 97Ajax 98        /**//// <summary>
Ajax 99        /// 新增产品
Ajax 100        /// </summary>
Ajax 101        /// <param name=”product”>产品的 Entity</param>
Ajax 102        public void AddProduct(Products product)
Ajax 103Ajax 104        Ajax 105{
Ajax 106            ctx.AddToProducts(product);
Ajax 107        }
Ajax 108
Ajax 109Ajax 110        /**//// <summary>
Ajax 111        /// 删除产品
Ajax 112        /// </summary>
Ajax 113        /// <param name=”product”>产品的 Entity</param>
Ajax 114        public void DeleteProduct(Products product)
Ajax 115Ajax 116        Ajax 117{
Ajax 118            product.Order_Details.Load();
Ajax 119            ctx.DeleteObject(product);
Ajax 120        }
Ajax 121
Ajax 122Ajax 123        /**//// <summary>
Ajax 124        /// 在此目的的光景文中保存修改(增/删/改的操作)
Ajax 125        /// </summary>
Ajax 126        public void Save()
Ajax 127Ajax 128        Ajax 129{
Ajax 130            ctx.SaveChanges();
Ajax 131        }
Ajax 132
Ajax 133Ajax 134        /**//// <summary>
Ajax 135        /// 在此目的的上下文中成立 EntityKey
Ajax 136        /// </summary>
Ajax 137        /// <param name=”entitySetName”>实体集的名目</param>
Ajax 138        /// <param name=”entity”>实体</param>
Ajax 139        /// <returns></returns>
Ajax 140        public System.Data.EntityKey CreateEntityKey(string entitySetName, object entity)
Ajax 141Ajax 142        Ajax 143{
Ajax 144            return ctx.CreateEntityKey(entitySetName, entity);
Ajax 145        }
Ajax 146    }
Ajax 147}
Ajax 148

ValidationEntity.cs(合法性验证)

Ajax 149using System;
Ajax 150using System.Collections.Generic;
Ajax 151using System.Linq;
Ajax 152using System.Web;
Ajax 153
Ajax 154namespace MVC.Models
Ajax 155Ajax 156Ajax 157{
Ajax 158Ajax 159    /**//// <summary>
Ajax 160    /// 验证音讯的实业
Ajax 161    /// </summary>
Ajax 162    public class ValidationEntity
Ajax 163Ajax 164    Ajax 165{
Ajax 166Ajax 167        /**//// <summary>
Ajax 168        /// 验证的错误音讯
Ajax 169        /// </summary>
Ajax 170Ajax 171        public string ErrorMessage Ajax 172{ get; set; }
Ajax 173Ajax 174        /**//// <summary>
Ajax 175        /// 发生错误信息的属性名称
Ajax 176        /// </summary>
Ajax 177Ajax 178        public string PropertyName Ajax 179{ get; set; }
Ajax 180        
Ajax 181        public ValidationEntity(string errorMessage)
Ajax 182Ajax 183        Ajax 184{
Ajax 185            ErrorMessage = errorMessage;
Ajax 186        }
Ajax 187
Ajax 188        public ValidationEntity(string errorMessage, string propertyName)
Ajax 189Ajax 190        Ajax 191{
Ajax 192            ErrorMessage = errorMessage;
Ajax 193            PropertyName = propertyName;
Ajax 194        }
Ajax 195    }
Ajax 196}
Ajax 197

Product.cs(合法性验证)

Ajax 198using System;
Ajax 199using System.Collections.Generic;
Ajax 200using System.Linq;
Ajax 201using System.Web;
Ajax 202
Ajax 203namespace MVC.Models
Ajax 204Ajax 205Ajax 206{
Ajax 207Ajax 208    /**//// <summary>
Ajax 209    /// 扩展 Product 实体
Ajax 210    /// 首假设为了对 Product 实体的依次属性做输入的合法性验证
Ajax 211    /// </summary>
Ajax 212    public partial class Products
Ajax 213Ajax 214    Ajax 215{
Ajax 216        List<ValidationEntity> info = new List<ValidationEntity>();
Ajax 217
Ajax 218Ajax 219        /**//// <summary>
Ajax 220        /// 对 Product 实体所做的改动是或不是经过了合法性验证
Ajax 221        /// </summary>
Ajax 222        public bool IsValid
Ajax 223Ajax 224        Ajax 225{
Ajax 226            get 
Ajax 227Ajax 228            Ajax 229{
Ajax 230                return GetValidation().Count() == 0;
Ajax 231            }
Ajax 232        }
Ajax 233        
Ajax 234Ajax 235        /**//// <summary>
Ajax 236        /// 再次回到验证音信列表
Ajax 237        /// </summary>
Ajax 238        /// <returns></returns>
Ajax 239        public List<ValidationEntity> GetValidation()
Ajax 240Ajax 241        Ajax 242{
Ajax 243            return info;
Ajax 244        }
Ajax 245
Ajax 246Ajax 247        /**//// <summary>
Ajax 248        /// 重写一些方法 OnProductNameChanging
Ajax 249        /// 用于在 ProductName 属性改变前,对其做合法性验证
Ajax 250        /// </summary>
Ajax 251        /// <param name=”value”></param>
Ajax 252        partial void OnProductNameChanging(string value)
Ajax 253Ajax 254        Ajax 255{
Ajax 256            if (string.IsNullOrEmpty(value))
Ajax 257                info.Add(new ValidationEntity(“请输入产品名称”, “ProductName”));
Ajax 258        }
Ajax 259
Ajax 260Ajax 261        /**//// <summary>
Ajax 262        /// 重写一些方法 OnUnitPriceChanging
Ajax 263        /// 用于在 UnitPrice 属性改变前,对其做合法性验证
Ajax 264        /// </summary>
Ajax 265        /// <param name=”value”></param>
Ajax 266        partial void OnUnitPriceChanging(global::System.Nullable<decimal> value)
Ajax 267Ajax 268        Ajax 269{
Ajax 270            if (value == null)
Ajax 271                info.Add(new ValidationEntity(“请输入单价”, “UnitPrice”));
Ajax 272            else if (((decimal)value) > 100)
Ajax 273                info.Add(new ValidationEntity(“输入的单价过高”, “UnitPrice”));
Ajax 274        }
Ajax 275    }
Ajax 276}
Ajax 277

2、Controller
ProductController.cs

Ajax 278using System;
Ajax 279using System.Collections.Generic;
Ajax 280using System.Linq;
Ajax 281using System.Web;
Ajax 282using System.Web.Mvc;
Ajax 283using System.Web.Mvc.Ajax;
Ajax 284
Ajax 285using MVC.Models;
Ajax 286
Ajax 287namespace MVC.Controllers
Ajax 288Ajax 289Ajax 290{
Ajax 291Ajax 292    /**//// <summary>
Ajax 293    /// MVC 之 Controller
Ajax 294    /// 那里反映了 Convention over Configuration
Ajax 295    /// Controller 类必须以字符串 Controller 做类名称的末段,字符串 Controller 以前的字符串为 Controller 的称谓,类中的方法名为 Action 的名称
Ajax 296    /// 例如 ProductController, Controller 的称号为:Product;其中的 Action 名称有 Index, Details, Edit 等
Ajax 297    /// </summary>
Ajax 298    public class ProductController : Controller // 须求后续自 System.Web.Mvc.Controller 或者完毕 IController 接口
Ajax 299Ajax 300    Ajax 301{
Ajax 302        ProductSystem ps = new ProductSystem();
Ajax 303
Ajax 304        // Action 的再次回到值必须为 ActionResult 或 void 
Ajax 305
Ajax 306Ajax 307        /**//// <summary>
Ajax 308        /// 获取 Product 的列表
Ajax 309        /// </summary>
Ajax 310        /// <param name=”pageIndex”>页索引</param>
Ajax 311        /// <returns></returns>
Ajax 312        public ActionResult Index(int pageIndex)
Ajax 313Ajax 314        Ajax 315{
Ajax 316            int pageSize = 10;
Ajax 317            var products = ps.GetProduct(pageIndex, pageSize);
Ajax 318
Ajax 319            // 此 Action 对应的 View 为(按搜索的先后顺序) Views/Product/Index.aspx, Views/Product/Index.ascx, Views/Shared/Index.aspx, Views/Shared/Index.ascx
Ajax 320            // 其所对应的 View 的关联对象为 products
Ajax 321            return View(“Index”, products);
Ajax 322        }
Ajax 323
Ajax 324        public ActionResult Details(int id)
Ajax 325Ajax 326        Ajax 327{
Ajax 328            var product = ps.GetProduct(id);
Ajax 329
Ajax 330            if (product == null)
Ajax 331                return View(“NotFound”);
Ajax 332            else
Ajax 333                // 对应的 View 的名称默许为 Action 的称呼,所以那边所对应的 View 的称谓为 Details
Ajax 334                return View(product);
Ajax 335        }
Ajax 336
Ajax 337        public ActionResult Edit(int id)
Ajax 338Ajax 339        Ajax 340{
Ajax 341            var product = ps.GetProduct(id);
Ajax 342
Ajax 343            if (product == null)
Ajax 344Ajax 345            Ajax 346{
Ajax 347                return View(“NotFound”);
Ajax 348            }
Ajax 349            else
Ajax 350Ajax 351            Ajax 352{
Ajax 353                product.CategoriesReference.Load();
Ajax 354
Ajax 355                // 编辑 Product 的时候须要在一个 DropDownList 中挑选其所对应的 Category, 所以那里要结构一个名为 CategoryAll 的 ViewData
Ajax 356                // 因为 Categories 已经是 Product 的性质了,所以这边的 ViewData 的 key 不可以为 Categories
Ajax 357                if (product.Categories == null)
Ajax 358                    ViewData[“CategoryAll”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”);
Ajax 359                else
Ajax 360                    ViewData[“CategoryAll”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”, product.Categories.CategoryID);
Ajax 361
Ajax 362                return View(“Edit”, product);
Ajax 363            }
Ajax 364        }
Ajax 365
Ajax 366        // 可以用 AcceptVerbs 来声称 Action 所对应的 http 方法
Ajax 367        [AcceptVerbs(HttpVerbs.Post)]
Ajax 368        public ActionResult Edit(int id, FormCollection formValues)
Ajax 369Ajax 370        Ajax 371{
Ajax 372            var product = ps.GetProduct(id);
Ajax 373
Ajax 374            // 可以通过那种措施挨个为 Product 对象的特性赋值
Ajax 375            // product.ProductName = Request.Form[“ProductName”];
Ajax 376
Ajax 377            // 也可以经过 UpdateModel, 让系统自动为属性赋值(通过反射的不二法门,取得对象的属性名称,然后和 Request 的 key 做协作,匹配成功的则赋值)
Ajax 378            UpdateModel<Products>(product);
Ajax 379
Ajax 380            var category = new CategeorySystem().GetCategory(int.Parse(Request.Form[“MyCategory”]));
Ajax 381            product.CategoriesReference.EntityKey = ps.CreateEntityKey(“Categories”, category);
Ajax 382
Ajax 383            // 通过以下的主意让 UpdateModel 只更新指定属性
Ajax 384            // string[] allowedProperties = new[] { “ProductName”, “UnitPrice” };
Ajax 385            // UpdateModel(product, allowedProperties);
Ajax 386
Ajax 387            if (!product.IsValid)
Ajax 388Ajax 389            Ajax 390{
Ajax 391                foreach (var validation in product.GetValidation())
Ajax 392Ajax 393                Ajax 394{
Ajax 395                    // 设置验证音讯
Ajax 396                    ModelState.AddModelError(validation.PropertyName, validation.ErrorMessage);
Ajax 397                }
Ajax 398
Ajax 399                if (product.Categories == null)
Ajax 400                    ViewData[“CategoryAll”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”);
Ajax 401                else
Ajax 402                    ViewData[“CategoryAll”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”, product.Categories.CategoryID);
Ajax 403
Ajax 404                return View(product);
Ajax 405            }
Ajax 406
Ajax 407            ps.Save();
Ajax 408
Ajax 409            // 跳转到指定的 Action
Ajax 410Ajax 411            return RedirectToAction(“Details”, new Ajax 412{ id = product.ProductID });
Ajax 413        }
Ajax 414
Ajax 415        public ActionResult Create()
Ajax 416Ajax 417        Ajax 418{
Ajax 419            Products product = new Products()
Ajax 420Ajax 421            Ajax 422{
Ajax 423                ProductName = “请输入产品名称”
Ajax 424            };
Ajax 425
Ajax 426            return View(product);
Ajax 427        }
Ajax 428
Ajax 429        // 可以为参数添加声明,如下例:[Bind(Include = “ProductName”)],客户端提交的数据中,唯有 ProductName 会被绑定到 Product 对象上
Ajax 430        // [Bind(Include = “ProductName”)] 那样的 attribute 也可以评释在类上,用于指定类中须要被绑定的特性
Ajax 431        [AcceptVerbs(HttpVerbs.Post)]
Ajax 432        public ActionResult Create([Bind(Include = “ProductName”)] Products product)
Ajax 433Ajax 434        Ajax 435{
Ajax 436            if (!product.IsValid)
Ajax 437Ajax 438            Ajax 439{
Ajax 440                foreach (var issue in product.GetValidation())
Ajax 441Ajax 442                Ajax 443{
Ajax 444                    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
Ajax 445                }
Ajax 446
Ajax 447                return View(product);
Ajax 448            }
Ajax 449
Ajax 450            ps.AddProduct(product);
Ajax 451            ps.Save();
Ajax 452
Ajax 453Ajax 454            return RedirectToAction(“Details”, new Ajax 455{ id = product.ProductID });
Ajax 456        }
Ajax 457
Ajax 458        public ActionResult Delete(int id)
Ajax 459Ajax 460        Ajax 461{
Ajax 462            var product = ps.GetProduct(id);
Ajax 463
Ajax 464            if (product == null)
Ajax 465                return View(“NotFound”);
Ajax 466            else
Ajax 467                return View(product);
Ajax 468        }
Ajax 469
Ajax 470        [AcceptVerbs(HttpVerbs.Post)]
Ajax 471        public ActionResult Delete(int id, string confirmButton)
Ajax 472Ajax 473        Ajax 474{
Ajax 475            var product = ps.GetProduct(id);
Ajax 476
Ajax 477            if (product == null)
Ajax 478                return View(“NotFound”);
Ajax 479
Ajax 480            ps.DeleteProduct(product);
Ajax 481            ps.Save();
Ajax 482
Ajax 483            return View(“Deleted”);
Ajax 484        }
Ajax 485    }
Ajax 486}

3、View(以列表页为例)
Index.aspx

Ajax 487Ajax 488<%Ajax 489@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>>” %>
Ajax 490
Ajax 491<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>
Ajax 492    Index
Ajax 493</asp:Content>
Ajax 494<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
Ajax 495    <h2>
Ajax 496        Index</h2>
Ajax 497    <table>
Ajax 498        <tr>
Ajax 499            <th>
Ajax 500            </th>
Ajax 501            <th>
Ajax 502                ProductID
Ajax 503            </th>
Ajax 504            <th>
Ajax 505                ProductName
Ajax 506            </th>
Ajax 507            <th>
Ajax 508                UnitPrice
Ajax 509            </th>
Ajax 510        </tr>
Ajax 511Ajax 512        <%Ajax 513  // 因为本页集成了 System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>>
Ajax 514            // 所以那里的 Model 就是 System.Web.Mvc.ViewPage<IEnumerable<MVC.Models.Products>> 的 Model 属性
Ajax 515            foreach (var item in Model)
Ajax 516            { %>
Ajax 517        <tr>
Ajax 518            <td>
Ajax 519                <!–那里的 Html 属性类型为 System.Web.Mvc.HtmlHelper–>
Ajax 520                <%= Html.ActionLink(“Delete”, “Delete”, new { id = item.ProductID })%>
Ajax 521                |
Ajax 522                <%= Html.ActionLink(“Edit”, “Edit”, new { id = item.ProductID }) %>
Ajax 523            </td>
Ajax 524            <td>
Ajax 525                <%= Html.ActionLink(item.ProductID.ToString(), “Details”, new { id=item.ProductID })%>
Ajax 526            </td>
Ajax 527            <td>
Ajax 528                <%= Html.Encode(item.ProductName) %>
Ajax 529            </td>
Ajax 530            <td>
Ajax 531                <%= Html.Encode(String.Format(“{0:F}”, item.UnitPrice)) %>
Ajax 532            </td>
Ajax 533        </tr>
Ajax 534Ajax 535        <%Ajax 536 } %>
Ajax 537    </table>
Ajax 538    <p>
Ajax 539        <%= Html.RouteLink(“上一页”, “Products”, new { pageIndex = Convert.ToInt32(Html.ViewContext.RouteData.Values[“pageIndex”]) – 1 })%>
Ajax 540        |
Ajax 541        <%= Html.RouteLink(“下一页”, “Products”, new { pageIndex = Convert.ToInt32(Html.ViewContext.RouteData.Values[“pageIndex”]) + 1 })%>
Ajax 542    </p>
Ajax 543</asp:Content>
Ajax 544

OK
[源码下载]

相关文章