鲜为人知的ASP.NET MVC 2.0框架高效之谜

原创
开发 后端
在本篇文章中,我将向你演示如何使用MVC 2.0框架创建一个ASP.NET Web应用。ASP.NET MVC 2.0是微软最新版框架,可以创建运行在.NET框架2.0、3.0或3.5上的Web应用。

【51CTO独家特稿】要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架。我把本文中的示例Web应用命名为“Employee Master Information”。51CTO-.NET频道向您推荐《ASP.NET MVC框架视频教程》以便于您更好的理解本文。

使用该应用程序,你可以输入新员工数据,编辑现有员工数据,可以查看特定员工数据,和从数据库中给删除任意员工信息。该应用程序还使用了ASP.NET的Membership Provider来创建新用户和认证已有用户,客户端验证通过JavaScript实现。

创建MVC项目

图1

创建MVC项目、数据库和数据模型

在此前的ASP.NET MVC 2.0文章中,我讨论过如何使用Visual Studio 2008编辑器来创建一个MVC Web应用程序。在本篇文章中我使用VS2008(.NET框架3.5)创建的项目名称为“MyMvcSample”。创建了MVC 2.0网站后,接下来将是创建数据库和数据模型。

创建数据库和数据模型

图2

右键点击项目的“App_Data”文件夹,并向你的解决方案增加一个“SQL Server Database”对象。如果你的开发环境中没有安装“SQL Express”,你不会在“Template”窗口中看到这个选项。将SQL Express数据库的名称指定为MySampleDatabase.mdf,点击“Add”按钮后,一个新数据库将被添加到App_Data文件夹中。现在从“View”菜单中打开“Server Explorer”;你将看到MySampleDatabase.mdf数据库已经存在。右键点击该数据库下的“Tables”对象,增加一个名为“tblEmployee”的新表。在该表中添加以下列。

  1. EmployeeName nvarchar(100)   
  2. EmployeeSalary numeric(18, 2)   
  3. EmployeeId int (Primary Key)   
  4. Department nvarchar(100)   
  5. Age int  
  6. Skillset nvarchar(1000)   
  7. Role nvarchar(50) 

对于主键列,你需要修改两个属性:将“Identity Specification”的值从“No”改为“Yes”,将“Identity Increment”从0改为1。表创建完后,增加一些示例数据以供测试用。

增加一些示例数据以供测试用

图3

接下来你需要创建一个数据模型,右键点击“Model”文件夹,并增加一个新条目。从模板列表中选择“ADO.NET Entity Data Model”。在本示例中我的模型名称为“DataModel.edmx”。点击增加按钮向你的解决方案添加该模型。接下来你将看到一个向导界面,它将指导你为刚才创建的模型增加数据源。选择“Generate from Database”并点击下一步。

接下来你需要选择合适的数据源,从列表中选择此前创建的“MySampleDatabase.mdf”,并为该数据源指定一个名称。在解决方案web.config文件下的“ConnectionStrings”标签下,你将看到一个自动生成的包含数据源名称和连接字符串的条目。在本例中我的连接名称是“MySampleDatabaseEntities”。接下来,检查tblEmployee,并向你的模型提供一个命名空间名称。

提供一个命名空间名称

图4

在模型创建后,在模型查看器中打开DataModel.edmx。该查看器将帮助你查看模型数据源,以及模型和数据库之间的字段映射。使用模型查看器你还可以更改模型属性、字段名和数据类型。这个“Employee”模型将被在Controller类中使用,来增加、编辑和删除数据库中的员工详细信息。DataModel.edmx是一个ADO.NET Entity Framework对象,可以在进行插入、更新或删除数据时减少代码编写工作量。ADO.NET Entity Framework还支持LINQ,因此你可以在业务对象上编写查询类的SQL,而无需编写存储过程来抓取数据。

编写查询类的SQL

图5

#p#

创建控制器

控制器将会用到 Microsoft.Web.Mvc.Build.dll和Microsoft.Web.Mvc.dll中的类。因此在编译应用程序之前,应检查上述两个动态库已经在你的bin文件夹下。

对于增加、编辑、删除和查看员工职责详细信息等操作,我已经在我的HomeController中增加了“Get”和“Post”函数。控制器中的每一个函数都被关联到一个视图(.ASPX页面),例如为了查看员工列表,我编写了“Index”函数来返回员工列表信息,该信息将被显示在名为“Index.aspx”的视图中。要想显示某个特定员工的数据,则会调用Details函数。

 

  1. Function Details(ByVal id As Integer) As ActionResult  
  2. Dim objEditEmployee = (From c In objDatabaseEntities.EmployeeSet 
  3. Where c.EmployeeId = id Select c).FirstOrDefault()  
  4.             Return View(objEditEmployee)  
  5. End Function 

LINQ被用来查询业务对象和从Employee List模型中查找某个特定员工。通过使用“Return View”,这个员工对象将被发回到相应的视图。至于创建一个新员工,我也为“Create”方法创建了“Get”和“Post”两个版本。该方法的Get版将重定向到一个空白Employee页面/视图,由用户来输入员工详细信息,而Post版的“Create”函数将使用我们之前创建的Employee Model对象保存数据库中的员工详细信息。51C TO-.NET频道向您推荐《LINQ教程-LINQ to SQL技术精解》专题。

框架应用

图6

我对Create.aspx页面中的所有输入字段都添加了合适的客户端验证代码。如果新输入的员工姓名已经存在,则数据不会被插入到数据库中。

 

  1. Function Create(ByVal objEmployee As Employee) As ActionResult  
  2.             Try  
  3. Dim objExtEmployee = (From c In objDatabaseEntities.EmployeeSet Where   
  4. c.EmployeeName = objEmployee.EmployeeName Select c).FirstOrDefault()  
  5.          If objExtEmployee Is Nothing Then  
  6.               objDatabaseEntities.AddToEmployeeSet(objEmployee)  
  7.               objDatabaseEntities.SaveChanges()  
  8.               Return RedirectToAction("Index")  
  9.                 End If  
  10.             Catch  
  11.                 Return View()  
  12.             End Try  
  13.             Return RedirectToAction("Index")  
  14. End Function 

对于编辑员工详细信息,我也创建“Get”和“Post”版的Edit函数,不过我在HomeController本身中增加了验证机制。如果验证失败的话,我会使用Modelstate.Addmodelerror()函数来向相应视图抛出一个错误信息。

  1. Protected Sub ValidateContact(ByVal EmployeeToValidate As Employee)  
  2.      If EmployeeToValidate.EmployeeName.Trim().Length = 0 Then  
  3.          ModelState.AddModelError("Employee Name", "Employee name is required   
  4.          field.")  
  5.      End If  
  6.      If EmployeeToValidate.EmployeeId.ToString().Trim().Length = 0 Then  
  7.      ModelState.AddModelError("Employee Id", "Employee Id is required field.")  
  8.      End If  
  9.      If (EmployeeToValidate.Department.Length = 0) Then  
  10.      ModelState.AddModelError("Employee Department", "Employee Department is   
  11.       required field.")  
  12.      End If  
  13.      If (EmployeeToValidate.EmployeeSalary.ToString().Length = 0) Then  
  14.      ModelState.AddModelError("Employee Salary", "Employee Salary is required   
  15.          field.")  
  16.      End If  
  17.      If (EmployeeToValidate.Age.ToString().Length = 0) Then  
  18.  ModelState.AddModelError("Employee Age", "Employee Age is required field.")  
  19.      End If  
  20.      If (EmployeeToValidate.Skillset.ToString().Length = 0) Then  
  21. ModelState.AddModelError("Employee Skillset", "Employee Skillset is required   
  22.          field.")  
  23.      End If  
  24.      If (EmployeeToValidate.Skillset.ToString().Length = 0) Then  
  25.          ModelState.AddModelError("Employee Role", "Employee Role is required   
  26.          field.")  
  27.      End If  
  28.  End Sub 

在删除员工列表方面,我只增加了一个Get版,并在视图中增加了必要的JavaScript验证代码(确认信息)。

创建视图

在一个ASP.NET MVC应用中,所有入站的浏览器请求都被映射到控制器行为上。控制器行为可能会返回一个视图。与ASP.NET页面不一样,MVC视图后端没有任何代码。你可以通过右键点击控制器post函数并选择“view”选项来创建视图。向项目增加视图的第二种方法是,右键点击你的视图文件夹,并增加一个新视图。默认情况下,没有后端代码的.ASPX就是这些视图。你可以在项目中增加一个.ASCX文件和HTML文件作为视图。

结果

图7

本例中,我创建了4个不同的视图来实现增加、编辑、列举和显示员工详细信息,它们都是强类型视图。我使用了HTML帮助类,在视图中创建HTML对象和验证信息来验证客户端数据项。以下代码显示了如何使用HTML帮助类创建一个HTML输入控制和添加验证。

  1. <div class="editor-field"> 
  2. <%= Html.TextBoxFor(Function(model) model.EmployeeName) %> 
  3. <%= Html.ValidationMessageFor(Function(model) model.EmployeeName) %> 
  4. </div> 

我试用HTML辅助方法ActionLink来实现视图导航,使用Html.Encode()来将“<”和“>”等特殊字符编码成可以在网页上正常显示的字符。微软推荐使用HTML.Encode()方法来防止JavaScript注入攻击。以下是向数据库增加一名新员工的代码。

  1. <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
  2.     <h2>Create Employee</h2> 
  3.     <%=""%> 
  4.     <% Using Html.BeginForm()%> 
  5.  
  6.         <fieldset> 
  7.             <legend>Details to Enter</legend>            
  8.             <div class="editor-label"> 
  9.                 <%=Html.LabelFor(Function(model) model.EmployeeName)%> 
  10.             </div> 
  11.             <div class="editor-field"> 
  12.              <%= Html.TextBoxFor(Function(model) model.EmployeeName) %> 
  13.      <%= Html.ValidationMessageFor(Function(model) model.EmployeeName) %> 
  14.             </div>            
  15.             <div class="editor-label"> 
  16.                 <%= Html.LabelFor(Function(model) model.EmployeeSalary) %> 
  17.             </div> 
  18.             <div class="editor-field"> 
  19.                 <%= Html.TextBoxFor(Function(model) model.EmployeeSalary) %> 
  20.     <%= Html.ValidationMessageFor(Function(model) model.EmployeeSalary) %> 
  21.             </div>            
  22.             <div class="editor-label"> 
  23.                 <%= Html.LabelFor(Function(model) model.EmployeeId) %> 
  24.             </div> 
  25.             <div class="editor-field"> 
  26.         <%= Html.TextBoxFor(Function(model) model.EmployeeId) %> 
  27.          <%= Html.ValidationMessageFor(Function(model) model.EmployeeId) %> 
  28.             </div>            
  29.             <div class="editor-label"> 
  30.                 <%= Html.LabelFor(Function(model) model.Department) %> 
  31.             </div> 
  32.             <div class="editor-field"> 
  33.                 <%= Html.TextBoxFor(Function(model) model.Department) %> 
  34.        <%= Html.ValidationMessageFor(Function(model) model.Department) %> 
  35.             </div>            
  36.             <div class="editor-label"> 
  37.                 <%= Html.LabelFor(Function(model) model.Age) %> 
  38.             </div> 
  39.             <div class="editor-field"> 
  40.                 <%= Html.TextBoxFor(Function(model) model.Age) %> 
  41.         <%= Html.ValidationMessageFor(Function(model) model.Age) %> 
  42.             </div> 
  43.               
  44.             <div class="editor-label"> 
  45.                 <%= Html.LabelFor(Function(model) model.Skillset) %> 
  46.             </div> 
  47.             <div class="editor-field"> 
  48.                 <%= Html.TextBoxFor(Function(model) model.Skillset) %> 
  49.          <%= Html.ValidationMessageFor(Function(model) model.Skillset) %> 
  50.             </div>            
  51.             <div class="editor-label"> 
  52.                 <%= Html.LabelFor(Function(model) model.Role) %> 
  53.             </div> 
  54.             <div class="editor-field"> 
  55.                 <%= Html.TextBoxFor(Function(model) model.Role) %> 
  56.          <%= Html.ValidationMessageFor(Function(model) model.Role) %> 
  57.             </div> 
  58.               
  59.             <p> 
  60.                 <input type="submit" value="Create" /> 
  61.             </p> 
  62.         </fieldset> 
  63.     <% End Using %> 
  64.     <div> 
  65.         <%=Html.ActionLink("Back to Employee List", "Index")%> 
  66.     </div> 
  67. </asp:Content> 

结束语

对于那些刚接触ASP.NET Web编程的开发者来说,学习MVC框架并不是一件难事。MVC框架应用程序的代码也非常容易维护。另外,开发者还可以在该框架中使用测试驱动开发方法。

原文题目:Create a Web App Using ASP.NET MVC 2.0 Framework

【编辑推荐】

  1. 添加设置ASP.NET Web时出现问题
  2. 详细说明ASP.NET 2.0功能支持
  3. 强化部署ASP.Net 2.0配置应用程序
  4. 微软PDC2009直击:改进ASP.NET 4运行时
  5. 详解ASP.NET MVC 2自定义验证
责任编辑:彭凡 来源: 51CTO
相关推荐

2010-06-23 15:44:03

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2010-06-25 08:51:46

ASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2010-01-07 10:05:51

IT顾问特质

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2014-06-30 09:22:38

ASP.NETBootstrap

2009-03-13 10:58:48

ASP.NetMVC框架编程

2011-05-03 13:13:52

编程PHPJava

2014-04-22 16:38:12

GitHubGitHub 使用技巧

2010-06-23 08:56:58

ASP.NET MVC

2009-07-22 17:23:03

XmlDataSourASP.NET 2.0

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 15:51:40

FubuMVC核心框架ASP.NET MVC

2009-07-24 10:55:00

asp.net mvc
点赞
收藏

51CTO技术栈公众号