怎样使用.NET RIA Services 创建 Silverlight Business Application(一)

简介: HRApp 项目是.NET RIA Services MSDN  上的案例,一个使用Silverlight 3.0 + .Net RIA Service 构建的完整商业应用程序, 学习英文版的开发手册总是比较费力的,所以顺带着简略翻译一下,也有部分自己心得体会,不足之处还望大家多多交流。

HRApp 项目是.NET RIA Services MSDN  上的案例,一个使用Silverlight 3.0 + .Net RIA Service 构建的完整商业应用程序,

学习英文版的开发手册总是比较费力的,所以顺带着简略翻译一下,也有部分自己心得体会,不足之处还望大家多多交流。

1 安装

1. 卸载以前的版本

a. Microsoft Silverlight (任何Silverlight 3 RTW之前的版本)

b. Microsoft Silverlight SDK

c. Microsoft Silverlight Tools for Visual Studio 2008

2. 安装.NET Framework 3.5 SP1 和Visual Studio 2008 SP1 (带 SQL Express),参考:

http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx.

3. 顺序安装以下最新版本软件:

a. Silverlight 3

b. Silverlight 3 SDK

c. Silverlight 3 Tools for Visual Studio 2008 SP1

4.  .NET RIA Services July Preview

2 创建工程

clip_image002[4]

选择创建Silverlight Business Application ,会自动添加所需.net RIA引用,并生成一个Silverlight项目和一个web项目。其中的web项目已经集成了登录和注册功能模块。按F5运行查看演示。默认的注册功能需要确保本机已经安装SQLSERVER 2005 EXPRESS ,第一次运行会提示更改配置文件以启用客户端调试。

clip_image004[4]

2.1 创建界面

1. 打开客户端工程中的MainTest.xaml文件,找到下面的代码

<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" Text="Application Name"/>

替换为

<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" Text="HR Application"/>

2. 选择HRApp项目,右击添加 New File.

3. 弹出对话框,选择Page ,命名为EmployeeList.

clip_image006[4]

4. 打开 EmployeeList.xaml 在<Grid>标记下添加下面的代码。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
<ScrollViewer BorderThickness="0" VerticalScrollBarVisibility="Auto" Padding="12,0,12,0" Margin="-12"> 
<StackPanel Margin="0,12,0,12" Orientation="Vertical" > 
<TextBlock Text="Employee List" Style="{StaticResource HeaderTextStyle}"/> 
</StackPanel> 
</ScrollViewer> 

5. 在项目面板中将EmployeeList.xaml拖动到 Views 文件夹中.

6. 打开MainPage.xaml 找到Home 链接按钮并在旁边再添加如下按钮<!-- XAML -->

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
<HyperlinkButton x:Name="Link3" Style="{StaticResource LinkStyle}" NavigateUri="/EmployeeList" TargetName="ContentFrame" Content="employee list"/> 
<Rectangle x:Name="Divider2" Style="{StaticResource DividerStyle}"/> 

7. 运行后如下图

clip_image008[4]

3 添加业务逻辑到 .NET RIA Services 工程

3.1 添加数据源

1. 将AdventureWorks_Data.mdfAdventureWorks_Log.ldf添加到App_Data目录下

2. 在web工程上右击添加新项ADO.NET Entity Data Model

3. 命名为 AdventureWorks.edmx。

clip_image010[4]

4. 在实体模型向导中, 选择generate the Model 后Next.

5. 选择 AdventureWorks 数据库 并设置实体集名称为 AdventureWorks_DataEntities.

clip_image012[4]

6. 为了简单起见,这里我们从所有表中选择Employee表作为实体模型. 设置命名空间为AdventureWorks_DataModel ,完成。

clip_image014[4]

7. 随后我们编译一下整个项目。

3.2 添加Domain Service Object and Query for Data

1. 在web工程上右击添加新建项(New Item)

2. 选择Web分类下, Domain Service Class,命名为OrganizationService。

clip_image016[4]

3. 在弹出的对话框中选择实体集中的Employee 表, 选中 Enable editingGenerate associated classes for metadataEnable Client Access 三个CheckBox。

clip_image018[4]

4. 从刚建的服务类中,我们可以看到,因为选中了Enabled Edit,所以VS为我们加入了增,删,改等功能接口。

5. 为了程序演示效果,我们让GetEmployee()返回已排序的对象列表。
将下面代码:

//  C# 

public  IQueryable < Employee >  GetEmployee() 

    
return   this .Context.Employee; 

替换为

//  C# 
public  IQueryable < Employee >  GetEmployee() 

      
return   this .Context.Employee.OrderBy(e  =>  e.EmployeeID); 

6. 按F6, 我们编译一下整个项目。(因为只有在每次编译时,.net Service 才会将DomainContext和所有实体对象类自动生成到客户端工程中)

7. 打开 EmployeeList.xaml. 从工具箱拖动一个DataGrid控件xaml. 并放在TextBlock下方。并向客户端工程中手动添加System.Windows.Controls.Data引用,在xaml中添加

xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"


如果是在Blend 中则可以直接拖动,不用麻烦了。构建成如下这样一个DataGrid。

< data:DataGrid  x:Name ="dataGrid1"  MinHeight ="100"  IsReadOnly ="True" ></ data:DataGrid >  

8. 打开EmployeeList.xaml.cs后台代码,加入下面的命名空间引用。

//  C# 
using  HRApp.Web; 
using  System.Windows.Ria.Data; 

9. 当客户端自动生成服务类代码后,可以看到OrganizationContext 已经可以被智能识别了。那么怎样载入服务器端的数据呢并绑定到DataGrid呢?只需简单的几行代码。

 

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
namespace HRApp 

    
public partial class EmployeeList : Page 

OrganizationContext _OrganizationContext 
= new OrganizationContext(); 
public EmployeeList() 

InitializeComponent(); 
this.dataGrid1.ItemsSource = _OrganizationContext.Employees; 
_OrganizationContext.Load(_OrganizationContext.GetEmployeeQuery()); 

// Occurs when the user navigates to this page. 
protected override void OnNavigatedTo(NavigationEventArgs e) 




10. 按F5 运行程序,点击EmployeeList 按钮,可以看到DataGrid和加载的数据.

clip_image020[4]

3.2.1 使用DomainDataSource控件

1. 在ASP.net中我们看到过LinqDataSource,在这里我们将添加一个新的控件DomainDataSource,其原理大致是一样的。

2. 首先在客户端工程中需要添加程序集引用,System.Windows.Ria.Controls.dll

3. 如果使用VS2005请如果没有请手动导入,在系统目录 ‘%ProgramFiles%\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight’ 下 . clip_image022[4]

4. 如果使用Blend 3.0开发,只需要拖动,在VS2008中要手动写界面代码。

5. 在XAML文件中添加程序集引用

<!-- XAML -->

xmlns:ds="clr-namespace:HRApp.Web"

xmlns: riaControls ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls"

6. 命名DomainDataSource 为employeeDataSource’ 并作如下设置

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployee" AutoLoad="True" > 

<riaControls:DomainDataSource.DomainContext> 

<ds:OrganizationContext/> 

</riaControls:DomainDataSource.DomainContext> 

</riaControls:DomainDataSource> 

7. 同时修改 DataGrid 代码:

< data:DataGrid  Height ="Auto"  MinHeight ="100"  IsReadOnly ="True"  ItemsSource =" {Binding Data, ElementName=employeeDataSource} "  
x:Name
="dataGrid1"   />  

8. 代开 EmployeeList.xaml.cs ,将代码如下全部注释。和LinqDataSource是不是很像?哈哈

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
//OrganizationContext _OrganizationContext = new OrganizationContext();
public EmployeeList()
{
    InitializeComponent();
    
//this.dataGrid1.ItemsSource = _OrganizationContext.Employees;
    
//_OrganizationContext.Load(_OrganizationContext.GetEmployeeQuery());
}

9. 可以运行程序了,看看数据是否显示?It’s Great e, No Code!

3.2.2 给数据源添加排序,过滤,分页功能

1. 向EmployeeList.xaml:中添加引用

xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Ria.Controls" 

2. SortDescriptorsDomainDataSource提供的专门用于排序的接口属性. 可以提供针对某个属性列上的排序,PropertyPath是对应的对象属性。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetEmployee" AutoLoad="True" > 
    
<riaControls:DomainDataSource.DomainContext> 
        
<ds:OrganizationContext/> 
    
</riaControls:DomainDataSource.DomainContext> 
    
<riaControls:DomainDataSource.SortDescriptors> 
        
<riaData:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" /> 
    
</riaControls:DomainDataSource.SortDescriptors> 
</riaControls:DomainDataSource> 

3. 运行程序即可看到EmployeeList按VacationHours 升序.

4. 下面看怎样使用过滤器.

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,-16,0,0">
                    
<TextBlock VerticalAlignment="Center" Text="Min Vacation Hours Filter" />
                    
<TextBox x:Name="vacationHoursText" Width="75" FontSize="11" Margin="4" Text="0"/>
                
</StackPanel>
        
                
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetEmployeeQuery" AutoLoad="True" >
                    
<riaControls:DomainDataSource.DomainContext>
                        
<ds:OrganizationContext/>
                    
</riaControls:DomainDataSource.DomainContext>
                    
<!--排序器-->
                    
<riaControls:DomainDataSource.SortDescriptors>
                        
<riaData:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" />
                    
</riaControls:DomainDataSource.SortDescriptors>
                    
<!--过滤器-->
                    
<riaControls:DomainDataSource.FilterDescriptors>
                        
<riaData:FilterDescriptorCollection>

                            
<riaData:FilterDescriptor PropertyPath="VacationHours" Operator="IsGreaterThanOrEqualTo">
                                
<riaData:ControlParameter ControlName="vacationHoursText"  PropertyName="Text" RefreshEventName="TextChanged" />
                            
</riaData:FilterDescriptor>

                        
</riaData:FilterDescriptorCollection>
                    
</riaControls:DomainDataSource.FilterDescriptors>

                
</riaControls:DomainDataSource>
                
<!--DataGrid-->
                
<data:DataGrid Height="Auto" MinHeight="100" IsReadOnly="True" ItemsSource="{Binding Data, ElementName=employeeDataSource}"  x:Name="dataGrid1" />

这里蓝色部分为过滤器提供了一个参数,这个参数值被绑定到一个TextBox控件的Text属性值。

Operator为一个FilterOperator枚举类型.RefreshEventName是使用Filter更新后的回调函数,这里我们让文本框在按下回车后就自动更新。

5. 运行程序,在“Min Vacation Hours Filter”旁的 TextBox中填入最小值,按回车。

clip_image024[4]

6. 下面我们给DataGrid 增加分页功能,从工具箱拖动一个 DataPager 控件EmployeeList.xaml.放在DataGrid的下面,

< data:DataPager  PageSize ="5"  Source =" {Binding Data, ElementName=employeeDataSource} "  Margin ="0,-1,0,0" ></ data:DataPager >

PageSize为页面大小,这里显示5行,并绑定数据。

7. 运行程序点击 employee list 链接. 嘿嘿,效果不错。clip_image026[6]

时间有限,今天就到译这里,下一篇将加入数据绑定及绑定验证。

目录
相关文章
|
测试技术 Go 数据库
使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。 Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。
960 0
|
数据库 测试技术 安全
使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题: 1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。
1226 0
|
数据库
使用Entity Framework和WCF Ria Services开发SilverLight之4:Map之主外键映射
上一篇粗粗讲了一下如何使用EF4.1,针对POCO进行MAP,此篇在此基础上进行一下深入,具体讲一下如何进行映射。   1:主外键中的1对多映射 还是针对School数据库。查看如下两个表: 可以知道,两者的关系是: 也就是说,Department对于Course来说,是1对多的关系。
772 0
|
C# 数据库 数据安全/隐私保护
怎样创建一个.NET RIA Services Application (二)
 这段时间比较忙,但还是抽时间把这篇给补完了。下篇主要讲.net RIA Services Domain Class 的数据验证功能和DataForm的插入更新操作,以及用户对操作的访问权限控制。等以后有时间再深入探讨RIA Services的Generator Code运行机制。
835 0
|
.NET C# 开发框架
Probems for Hosted ADO.NET Data Services & Silverlight
I’ll be the first to admit I’m a novice in world of web development, so I expected a learning curve and my fair share of hurdles as I started a new project in Silverlight and ASP.
803 0