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

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

ProductSystem.cs(业务逻辑)

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

ValidationEntity.cs(合法性验证)

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

Product.cs(合法性验证)

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

2、Controller
ProductController.cs

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

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

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

OK
[源码下载]

相关文章