Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

1、MVC简单入门

1.一、MVC概念

视图(View)html

表明用户交互界面,对于Web应用来讲,能够归纳为HTML界面,但有可能为XHTMLXMLAppletgit

模型(Model)github

表示用户对其数据的操做的一个封转。能够分为视图模型(view model)和领域模型(domain models),视图模型就是在视图与控制器之间传输数据的一个封转,而领域模型就是业务逻辑,后台数据模型等的一个集合。是咱们学的3层中的BLLDALModels的集合 数据库

控制器(Controller)浏览器

控制器能够理解为从用户接收请求,将模型与视图匹配在一块儿,共同完成用户的请求。框架

1.2ASP.NET MVC 原理

当在浏览器中输入一个URL,进入了Route系统,路由系统获得URL各个片断的值,并交给MVC处理,MVC依据URL的信息知道请求的Action,接着就对模型进行一系列的处理,而后呈现视图。dom

MVC对控制器与View有必定的限制,但对模型没有任何的限制。ide

控制器必须实现IController接口或者继承Controller类,控制器类中的公有方法称之为Action Method工具

1.3、MVC项目结构及含义

1.4MVC命名习惯

MVC项目中有2种习惯布局

a、建议你如何组织项目中的一些文件,好比js文件放在Scripts文件夹下,像这种习惯,你彻底能够不遵循,这些文件夹和文件删除并不影响MVC框架自己。

b、另一种,有个专门的术语:Convention over configuration,意思就是说若是你遵循了这个习惯就不须要进行额外的配置或编码(特别是控制器与视图)。这种习惯就尽可能遵循,若是违反,在MVC中就须要作许多的事情。

主要有3个方面:

a、控制器命名习惯:控制器类必须以Controller结尾,但引用这个控制器的时候能够省略掉Controller,若是想改变这种行为,须要本身实现IControllerFactory接口,默认是经过DefaultControllerFactory来执行这个控制器的查找的。

b、视图命名习惯:视图或者分部视图应该放在/Views/Controllername文件夹下面,好比一个控制器为Demo 那么这个控制器的全部视图应该放在/Views/Demo/下面,默认状况下,每个Action Method对应一个视图,尽

量让视图名字与Action名字同样,这样在Action中就能够直接return View();而放在Shared文件夹下面的视图全部的控制器均可以使用

c、布局命名习惯:布局文件都如下划线开头,并放置在shared文件夹下面,在MVC 3中默认每一个视图都会用到_layout.cshtml布局,能够在_viewstart.cshtml看到这个设置

1.5ASP.NET MVC优缺点

优势:

A、具备多个视图对应一个模型的能力。

B、因为一个应用被分离为三层,所以有时改变其中的一层就能知足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。

C、它还有利于软件工程化管理。因为不一样的层各司其职,每一层不一样的应用具备某些相同的特征,有利于经过工程化、工具化产生管理程序代码。

缺点:

A、增长了系统结构和实现的复杂性。

B、视图与控制器间的过于紧密的链接。

C、视图对模型数据的低效率访问。

1.6、建立第一个MVC应用程序

建立第一个MVC应用程序以前,首先说明一下个人电脑使用配置环境:VS2013SQLSever2012

1、首先打开VS2013,新建一个MVC4项目。

2、点击肯定后会弹出以下图界面。

3、点击肯定后会自动生成以下默认项目结构。

四、Controller文件夹上右键添加一个控制器。

五、点击添加按钮后,生成HomeController类,默认生成Index()方法以下:

 六、如今Controller控制器已经建立好了,下面来建立一个View视图了,添加添加视图两种方式:方式一:在控制器里的Index()方法里右键添加视图,方式二:在View文件夹上右键添加一个与HomeController控制器名称相同的文件夹如:Home文件夹,在该文件夹上右键添加一个与Index()方法同名的视图。这里选择选择方式一建立方法以下所示:

七、最终添加视图后的界面,开始运行浏览查看结果。

到这里咱们的第一个MVC程序Hello World就完成了,是否是感受很简单。那么接下来就来学习写一个关于Asp.Net MVC的增删改查的简单测试案例吧。已经学习过Asp.Net的同窗能够先思考一下如何用MVC实现一个增删改查的的功能。没有学习过的同窗能够思考下逻辑三层与MVC中Model的联系,下面这个简单测试案例将让你对MVC概念的理解的更明白些。

 1.七、实现一个关于Asp.Net MVC的增删改查的简单测试案例

测试案例增删改查效果图以下:

一、首先准备数据库数据。

use master
go
create database Demo
go
use Demo
go
create table Product
(
    ID int primary key identity(1,1),
    Name nvarchar(20),
    Price decimal
)
go
insert into Product values('电脑垫',22),('鼠标',55),('键盘',22),('网线',32),('U盘',100),('咖啡',55),('书籍',99),('牛奶',5)
go

二、打开VS2013建立一个名为MvcFristDemo的MVC4项目,建立步骤与上面一致,这里步骤再也不详细介绍,最终项目建立完成截图以下。

这里须要说明一下添加视图的步骤与上面Hello World示例有所区别:由于要用到Model模型,因此在添加视图的时候须要选中以下图中的建立强类型视图 模型选择Product模型。

三、步骤一:ProductController控制器代码以下。

 1 using MvcFirstDemo.Models;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 
 8 namespace MvcFirstDemo.Controllers
 9 {
10     public class ProductController : Controller
11     {
12         public ActionResult List()
13         {
14             List<Product> result = new ProductBll().Select();
15             return View(result);
16         }
17 
18 
19         public ActionResult Add()
20         {
21             return View();
22         }
23         [HttpPost]
24         public ActionResult Add(Product p)
25         {
26             bool result = new ProductBll().Insert(p);
27             return RedirectToAction("List");
28         }
29 
30         public ViewResult Update(int id)
31         {
32             Product p = new ProductBll().GetProductById(id);
33             return View(p);
34         }
35         [HttpPost]
36         public ActionResult Update(Product p)
37         {
38             bool result = new ProductBll().Update(p);
39             return RedirectToAction("List");
40         }
41 
42         public ActionResult Delete(int id)
43         {
44             bool result = new ProductBll().Delete(id);
45             return RedirectToAction("List");
46         }
47     }
48 }

四、步骤二:Model文件夹中的三个类代码以下。

Product.cs代码以下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace MvcFirstDemo.Models
 7 {
 8     public class Product
 9     {
10         public int ID { get; set; }
11         public string  Name { get; set; }
12         public decimal Price { get; set; }
13     }
14 }

 ProductBll.cs代码以下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace MvcFirstDemo.Models
 7 {
 8     public class ProductBll
 9     {
10         ProductDal dal = new ProductDal();
11         public List<Product> Select()
12         {
13             return dal.Select();
14         }
15         public Product GetProductById(int id)
16         {
17             return dal.GetProductById(id);
18         }
19         public bool Update(Product p)
20         {
21             return dal.Update(p);
22         }
23 
24         public bool Insert(Product p)
25         {
26             return dal.Insert(p);
27         }
28 
29         public bool Delete(int id)
30         {
31             return dal.Delete(id);
32         }
35     }
36 }

 ProductDal.cs代码以下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data.SqlClient;
  4 using System.Linq;
  5 using System.Web;
  6 
  7 namespace MvcFirstDemo.Models
  8 {
  9     public class ProductDal
 10     {
 11         string connStr = @"server=PC-201511211346\MSSQLSERVER2;database=Demo;uid=sa;pwd=123456;";
 12         public List<Product> Select()
 13         {
 14             using (SqlConnection conn = new SqlConnection(connStr))
 15             {
 16                 conn.Open();
 17                 string SQL = "select * from Product";
 18                 SqlCommand cmd = new SqlCommand(SQL, conn);
 19                 using (SqlDataReader sdr = cmd.ExecuteReader())
 20                 {
 21                     List<Product> list = new List<Product>();
 22                     Product obj = null;
 23                     while (sdr.Read())
 24                     {
 25                         obj = new Product
 26                         {
 27                             ID = Convert.ToInt32(sdr["ID"]),
 28                             Name = sdr["Name"].ToString(),
 29                             Price = Convert.ToDecimal(sdr["Price"])
 30                         };
 31                         list.Add(obj);
 32                     }
 33                     return list;
 34                 }
 35             }
 36         }
 37 
 38         public bool Insert(Product p)
 39         {
 40             using (SqlConnection conn = new SqlConnection(connStr))
 41             {
 42                 conn.Open();
 43                 string SQL = "insert into Product values(@Name,@Price)";
 44                 SqlCommand cmd = new SqlCommand(SQL, conn);
 45                 cmd.Parameters.AddWithValue("Name", p.Name);
 46                 cmd.Parameters.AddWithValue("Price", p.Price);
 47                 return cmd.ExecuteNonQuery() > 0 ? true : false;
 48             }
 49         }
 50 
 51         public bool Update(Product p)
 52         {
 53             using (SqlConnection conn = new SqlConnection(connStr))
 54             {
 55                 conn.Open();
 56                 string SQL = "update Product set Name=@Name,Price=@Price where ID=@ID";
 57                 SqlCommand cmd = new SqlCommand(SQL, conn);
 58                 cmd.Parameters.AddWithValue("@ID", p.ID);
 59                 cmd.Parameters.AddWithValue("@Name", p.Name);
 60                 cmd.Parameters.AddWithValue("@Price", p.Price);
 61 
 62                 return cmd.ExecuteNonQuery() > 0 ? true : false;
 63             }
 64         }
 65 
 66         public bool Delete(int id)
 67         {
 68             using (SqlConnection conn = new SqlConnection(connStr))
 69             {
 70                 conn.Open();
 71                 string SQL = "delete from Product where ID=@ID";
 72                 SqlCommand cmd = new SqlCommand(SQL, conn);
 73                 cmd.Parameters.AddWithValue("@ID", id);
 74                 return cmd.ExecuteNonQuery() > 0 ? true : false;
 75             }
 76         }
 77 
 78         internal Product GetProductById(int id)
 79         {
 80             using (SqlConnection conn = new SqlConnection(connStr))
 81             {
 82                 conn.Open();
 83                 string SQL = "select * from Product where ID=@ID";
 84                 SqlCommand cmd = new SqlCommand(SQL, conn);
 85                 cmd.Parameters.AddWithValue("@ID", id);
 86                 using (SqlDataReader sdr = cmd.ExecuteReader())
 87                 {
 88                     Product obj = null;
 89                     while (sdr.Read())
 90                     {
 91                         obj = new Product
 92                         {
 93                             ID = Convert.ToInt32(sdr["ID"]),
 94                            Name = sdr["Name"].ToString(),
 95                             Price = Convert.ToDecimal(sdr["Price"])
 96                         };
 97                     }
 98                     return obj;
 99                 }
100             }
101         }
102     }
103 }

五、步骤三:View文件夹中三个视图代码以下。

这里须要说明一下的是对List.aspx页面中图一中默认生成代码改为图二中代码,修改为红色部分代码:<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<List<MvcFirstDemo.Models.Product>>" %>

为何要这样修改呢?由于咱们在ProductDal.cs类中的Select()方法返回的是list<Product>集合 ,而在List.aspx页面中foreach须要遍历一个List<Product>集合绑定显示列表。若是你不作修改,运行程序后会出现以下图所示错误。

List.aspx页面代码以下:

 1 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<List<MvcFirstDemo.Models.Product>>" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html>
 6 <head runat="server">
 7     <meta name="viewport" content="width=device-width" />
 8     <title>List</title>
 9 </head>
10 <body>
11     <div>
12         <table cellspacing="1"  border="1">
13             <tr>
14                 <td>产品ID</td>
15                 <td>产品名称</td>
16                 <td>产品价格</td>
17                 <td>操做 <a href="Product/Add">增长</a></td>
18             </tr>
19             <%
20                 foreach (var item in Model)
21                 {  
22             %>
23             <tr>
24                 <td><%=item.ID %></td>
25                 <td><%=item.Name %></td>
26                 <td><%=item.Price %></td>
27                 <td>
28                     <a href="/Product/Update?id=<%=item.ID %>">修改</a>
29                     <a href="/Product/Delete?id=<%=item.ID %>">删除</a>
30                 </td>
31             </tr>
32             <%
33                 } 
34             %>
35         </table>
36     </div>
37 </body>
38 </html>

Add.aspx页面代码以下:

 1 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MvcFirstDemo.Models.Product>" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html>
 6 <head runat="server">
 7     <meta name="viewport" content="width=device-width" />
 8     <title>Add</title>
 9 </head>
10 <body>
11     <div>
12         <form action="/Product/Add" method="post">
13             <input type="text" name="Name" value=" " />
14             <input type="text" name="Price" value=" " />
15             <input type="submit" name="submit" value="增长" />
16         </form>
17     </div>
18 </body>
19 </html>

Update.aspx页面代码以下:

 1 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MvcFirstDemo.Models.Product>" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html>
 6 <head runat="server">
 7     <meta name="viewport" content="width=device-width" />
 8     <title>Update</title>
 9 </head>
10 <body>
11     <div>
12         <form action="/Product/Update" method="post">
13             <input type="hidden" name="ID" value="<%=Model.ID%>" />
14             <input type="text" name="Name" value="<%=Model.Name %>" />
15             <input type="text" name="Price" value="<%=Model.Price %>" />
16             <input type="submit" name="submit" value="修改" />
17         </form>
18     </div>
19 </body>
20 </html>

 

2、初学者常见的几个错误总结。

2.一、错误一

解决办法:此错误解决方式有三个,方式一:在图二中Update(int id)方法修改为能够为null的方法Update(int? id),方式二:给图二中Update(int id)方法参数添加一个默认值如:Update(int id=0)便可。方式三:把图二中的参数名dd改为与图一中传递的参数名id同样的名字便可解决为null问题得到数据。

2.二、错误二

解决办法:在以下图中方法重载代码处,其中一个方法添加一个特性如[HttpPost]、[HttpPut]、[HttpPatch],便可解决此问题,至于添加哪一个特性须要依据你发起请求的方法而决定。

2.三、错误三

解决办法:此问题的解决办法在上面步骤三中已作解释说明,这里再也不重复解释。

2.四、错误四

解决办法:把下图中的传递表单数据的参数名字改为与Product模型类里的字段名同样便可得到表单传递过来的数据。

2.四、错误五

解决办法:查看页面代码发现浏览器请求的页面路径并无错误,可是运行又确实报错,找不到请求URL指定路径的页面,这该怎么办呢?咱们冷静分析一下,这里其实牵涉到了一个知识点,就是你对MVC原理的理解,在前面1.二、Asp.Net MVC的原理节中已经讲到MVC的原理,因此这里咱们只须要作以下图所示修改便可解决此问题。

 

 

3、示例下载

Github下载地址:https://github.com/SeeYouBug2/MvcFirstDemo.git

总结:在本文章中,主要是对理解ASP.NET MVC的相关概念作了个简单介绍,以及经过一个MVC增删改查简单测试案例帮助初学者加深对MVC模式的理解,最后还总结了初学者几个常见的错误,让初学者少走点弯路。

相关文章
相关标签/搜索