一起谈.NET技术,鲜为人知的ASP.NET MVC 2.0框架高效之谜

  要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架。我把本文中的示例Web应用命名为“Employee Master Information”。

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

图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”的新表。在该表中添加以下列。


EmployeeName nvarchar(100)
EmployeeSalary numeric(18, 2)
EmployeeId int (Primary Key)
Department nvarchar(100)
Age int
Skillset nvarchar(1000)
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,而无需编写存储过程来抓取数据。

  图5

  创建控制器

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

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


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

  LINQ被用来查询业务对象和从Employee List模型中查找某个特定员工。通过使用“Return View”,这个员工对象将被发回到相应的视图。至于创建一个新员工,我也为“Create”方法创建了“Get”和“Post”两个版本。该方法的Get版将重定向到一个空白Employee页面/视图,由用户来输入员工详细信息,而Post版的“Create”函数将使用我们之前创建的Employee Model对象保存数据库中的员工详细信息。

图6

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


Function Create(ByVal objEmployee As Employee) As ActionResult
Try
Dim objExtEmployee = (From c In objDatabaseEntities.EmployeeSet Where
c.EmployeeName = objEmployee.EmployeeName Select c).FirstOrDefault()
If objExtEmployee Is Nothing Then
objDatabaseEntities.AddToEmployeeSet(objEmployee)
objDatabaseEntities.SaveChanges()
Return RedirectToAction("Index")
End If
Catch
Return View()
End Try
Return RedirectToAction("Index")
End Function

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


Protected Sub ValidateContact(ByVal EmployeeToValidate As Employee)
If EmployeeToValidate.EmployeeName.Trim().Length = 0 Then
ModelState.AddModelError("Employee Name", "Employee name is required
field.")
End If
If EmployeeToValidate.EmployeeId.ToString().Trim().Length = 0 Then
ModelState.AddModelError("Employee Id", "Employee Id is required field.")
End If
If (EmployeeToValidate.Department.Length = 0) Then
ModelState.AddModelError("Employee Department", "Employee Department is
required field.")
End If
If (EmployeeToValidate.EmployeeSalary.ToString().Length = 0) Then
ModelState.AddModelError("Employee Salary", "Employee Salary is required
field.")
End If
If (EmployeeToValidate.Age.ToString().Length = 0) Then
ModelState.AddModelError("Employee Age", "Employee Age is required field.")
End If
If (EmployeeToValidate.Skillset.ToString().Length = 0) Then
ModelState.AddModelError("Employee Skillset", "Employee Skillset is required
field.")
End If
If (EmployeeToValidate.Skillset.ToString().Length = 0) Then
ModelState.AddModelError("Employee Role", "Employee Role is required
field.")
End If
End Sub

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

  创建视图

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

图7

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


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

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


<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create Employee</h2>
<%=""%>
<% Using Html.BeginForm()%>

<fieldset>
<legend>Details to Enter</legend>
<div class="editor-label">
<%=Html.LabelFor(Function(model) model.EmployeeName)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.EmployeeName) %>
<%= Html.ValidationMessageFor(Function(model) model.EmployeeName) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(Function(model) model.EmployeeSalary) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.EmployeeSalary) %>
<%= Html.ValidationMessageFor(Function(model) model.EmployeeSalary) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(Function(model) model.EmployeeId) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.EmployeeId) %>
<%= Html.ValidationMessageFor(Function(model) model.EmployeeId) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(Function(model) model.Department) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.Department) %>
<%= Html.ValidationMessageFor(Function(model) model.Department) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(Function(model) model.Age) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.Age) %>
<%= Html.ValidationMessageFor(Function(model) model.Age) %>
</div>

<div class="editor-label">
<%= Html.LabelFor(Function(model) model.Skillset) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.Skillset) %>
<%= Html.ValidationMessageFor(Function(model) model.Skillset) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(Function(model) model.Role) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(Function(model) model.Role) %>
<%= Html.ValidationMessageFor(Function(model) model.Role) %>
</div>

<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% End Using %>
<div>
<%=Html.ActionLink("Back to Employee List", "Index")%>
</div>
</asp:Content>

  结束语

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

时间: 2024-10-23 03:30:37

一起谈.NET技术,鲜为人知的ASP.NET MVC 2.0框架高效之谜的相关文章

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

要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架.我把本文中的示例Web应用命名为"Employee Master Information". 使用该应用程序,你可以输入新员工数据,编辑现有员工数据,可以查看特定员工数据,和从数据库中给删除任意员工信息.该应用程序还使用了ASP.NET的Membership Provider来创建新用户和认证已有用户,客户端验证通过

一起谈.NET技术,将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程

开发环境:Win7+IIS7+VS2008 SP1+ASP.NET MVC 2.0 RC 在部署MVC应用之前,一定要确保你的程序BIN文件夹下面是否包含 System.Web.Mvc.dll(非常重要),如图: 如果没有, 请在你的MVC项目中,打开引用列表,如图:   鼠标右键点击System.Web.Mvc,选择"属性",转到下面窗口: 将"复制本地"设为True (默认为False),然后生成一下项目,System.Web.Mvc.dll就会出现在BIN文件

一起谈.NET技术,[翻译]ASP.NET MVC 3 RC 发布通告

今天早上,ASP.NET组发布了ASP.NET 3 RC版(release candidate).你们可以从这里进行下载here. ASP.NET MVC 3是个很完美的发布,增加了大量的功能改进.它可以向后兼容ASP.NET MVC V1 和 V2,可以轻易的升级你现有的项目(可以阅读发布须知,根据里面的步骤去做).你还可以通过我之前发表的博客文章来学习ASP.NET MVC 3的很多功能.  今天的ASP.NET MVC 3 RC build 包含了一些附加的功能改进(除了修正了一些bug外

一起谈.NET技术,跟ASP.NET MVC一起使用jQuery

藉由ASP.NET MVC内置的扩展性,开发人员便可以使用第三方库,例如jQuery.在使用ASP.NET Webforms的时候,如果使用jQuery而不是ASP.NET AJAX,难度会比较大. 刚开始撰写本文的时候,ASP.NET MVC的版本是Preview 4,有些在Preview 4中使用的技术可能无法在早期版本中正常工作.Preview 4可以在CodePlex上下载. 初步配置 我不打算把它写成一篇完整的jQuery指南,只是简单给出几个跟ASP.NET MVC一起使用这款Jav

一起谈.NET技术,在ASP.NET MVC中进行TDD开发

TDD介绍 TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发.作者是Kent Beck.首先让我介绍一下三种常见的开发方式: 第一种:先Coding,然后Bug Fix. 第二种:先Coding,然后Unit Test,最后Bug Fix.很显然用了单元测试的比第一种开发方式要好不少. 第三种:就是本文要说的TDD,它的方式和第二种恰恰相反.TDD先设计单元测试,然后再Coding,最后修复Bug.看下图: TDD开发过程可以看成:给制自己制定一个目

一起谈.NET技术,利用ASP.NET MVC源代码调试你的应用程序

之前写了一篇博客:利用.NET Framework4.0的源代码调试你的应用程序.那篇文章教你如何利用.NET Framework4.0的源代码帮助你调试应用程序,其实也就是进入.NET Framework4.0源代码进行单步调试.由于项目需要,最近学起asp.net mvc.昨天遇到ViewData和TempData他们之间的分别这样让我纠结的问题.有园友强烈建议我去看ASP.NET MVC的源代码.所以,我想到如何在调试ASP.NET MVC程序的时候,有不明白的地方,就单步进入ASP.NE

一起谈.NET技术,体验ASP.NET MVC 3中的Razor特性

1 闲话ASP.NET MVC 3 beta 不知道不觉MVC3更新了好几次了...因为一直在弄Silverlight的开发没有时间关注ASP.NET MVC.之前出preview 的时候就看了园子里的一些文章. 但是总觉得"不咋地",依赖注入早就有一套了,全局拦截器也就那么回事..好像都没有对开发效率有太大的提升...(一己之见.目前正在学习MVC3BEAT的DI). 除了RAZOR...  好吧. 现在开始动手吧! 2开工  2.1目录     在_ViewStart.cshtml

一起谈.NET技术,探索Asp.net mvc 的文件上传(由浅入深)

代码下载:http://files.cnblogs.com/n-pei/mvcfileupload.zip 最近因为TeamVideo需要用到视频和图片上传功能,所以试着Google了很多资料,和大家分享下. 1.最基本的文件上传 在View界面通过Form把数据POST到控制端(Controller),Controller把文件存储到服务器,再Redirect到其他页面. View部分的代码: Controller部分需要判断是否有Post过来文件,有文件就保存,再重定向到index页面. 上

ASP.NET MVC 1.0浅析

为什么要用ASP.NET MVC 1.0?当我刚知道1.0发布的时候,经常这样问. 最近正在考虑是否在我们的企业级应用中使用ASP.NET MVC 1.0框架,因此会一直找使用它的理由,希 望大家在关注技术的同时,结合企业应用谈谈自己的看法. 1.MVC的组成 Models:访问数据库,装载数据.处理业务逻辑.在项目中体现为数据实体类加业务代理类. Views:显示数据,用户界面.在项目中体现为aspx页面,偶尔可以加上code-behind. Controller:按路由规则将请求的数据传送给