SilverLight商业应用程序开发---学习笔记(6)从服务器中获取数据之二
2012-05-09 10:13
716 查看
使用RIA服务向服务器提交变更的数据
实例:使用DomainDataSource控件向服务器提交变更数据有两种方法实现:一是在XMAL文件的后置代码中调用该方法;二是将按钮(按钮单击后向服务器提交数据)的Command属性绑定到DomainDataSource控件的SubmitChangesCommand属性上;
第二种方法的实现代码:
<ButtonContent="SaveChanges"Width="100"Height="30" Command="{BindingSubmitChangesCommand, ElementName=productDomainDataSource}"/>
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
实例:通过域上下文向服务器提交变更数据
域上下文类有一个SubmitChanges方法,可以将客户端的变更传递到服务器:
1)向视图中添加按钮,其Click事件在后置代码中处理:
<ButtonContent="SaveChanges"Click="SaveChangesButton_Click" Width="100"Height="30"/>
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
2)为了确保查询与更新数据使用的上下文是同一对象,需要在后置代码中定义一个私有变量用于存储上下文对象,然后在视图的构造器中将此上下文对象实例化,这样就可以统一使用这一对象了;
privateProductContext_context=null; publicProductListView() { InitializeComponent(); _context=newProductContext(); EntityQuery<Product>qry=_context.GetProductsQuery(); LoadOperation<Product>operation=_context.Load(qry); productDataGrid.ItemsSource=operation.Entities; }
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
3)在Button控件的Click事件处理方法里调用上下文的SubmitChanges方法:
privatevoidSaveChangesButton_Click(objectsender, System.Windows.RoutedEventArgse) { SubmitOperationsubmitOperation=_context.SubmitChanges(); }
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
处理提交数据过程中的错误
如果采用DomainDataSource控件,需要调用SubmittedChanged事件处理提交数据过程中的错误,如果使用域上下文来提交数据,则需要处理SumbitOperation对象的Complete事件来处理错误。采用DomainDataSource控件处理错误的案例
privatevoidproductDomainDataSource_SubmittedChanges(objectsender, SubmittedChangesEventArgse) { if(e.HasError) { MessageBox.Show(e.Error.Message); e.MarkErrorAsHandled(); } }
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
采用域上下文类处理错误的案例
首先要为SumbitOperation对象添加Complete事件的委托:
SubmitOperationsubmitOperation=_context.SubmitChanges();
submitOperation.Completed+=submitOperation_Completed;
再编写submitOperation_Completed处理方法:
privatevoidsubmitOperation_Completed(objectsender,System.EventArgse)
{
SubmitOperationsubmitOperation=senderasSubmitOperation;
if(submitOperation.HasError)
{
MessageBox.Show(submitOperation.Error.Message);
submitOperation.MarkErrorAsHandled();
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
两种方法捕获的异常都可以强制转换为DomainOperationException类型,并且使用OperationErrorStatus枚举来判断异常的类型,该枚举成员如下(与上一节的内容类似):
示例如下:
if(e.HasError)
{
DomainOperationExceptionerror=e.ErrorasDomainOperationException;
switch(error.Status)
{
caseOperationErrorStatus.Conflicts:
//Handleconcurrencyviolations
break;
caseOperationErrorStatus.ServerError:
//Handleservererrors
break;
caseOperationErrorStatus.Unauthorized:
//Handleunauthorizeddomainoperationaccess
break;
caseOperationErrorStatus.ValidationFailed:
//Handlevalidationrulefailures
break;
default:
//Handleotherpossiblestatuses
break;
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
并发冲突的处理,一般有如下几种方法:
1)弃用更新数据,重新输入原始数据(不太友好);
2)使用用户最后更新的数据覆盖服务器上的值(可能会丢失数据);
3)显示当前版本(用户想要更新的数据)与存储版本(数据库中的数据),让用户自行取舍;
4)尝试自动将变更数据并入;
下面的案例选择了第2种方法:
if(submitOperation.HasError)
{
DomainOperationExceptionerror=
submitOperation.ErrorasDomainOperationException;
if(error.Status==OperationErrorStatus.Conflicts)
{
//Loopthroughtheentitieswithconcurrencyviolations
foreach(ProductproductinsubmitOperation.EntitiesInError)
{
EntityConflictconflictinfo=product.EntityConflict;
ProductcurrentProduct=conflictinfo.CurrentEntityasProduct;
ProductoriginalProduct=conflictinfo.OriginalEntityasProduct;
ProductstoreProduct=conflictinfo.StoreEntityasProduct;
//Handleanyconflictsautomatically(ifyouwish)
//Youcangetthenamesofthepropertieswhosevaluehaschanged
//fromtheconflictinfo.PropertyNamesproperty
//Forcetheuser'sversiontooverwritetheserver’sversion
product.EntityConflict.Resolve();
}
}
}
创建Http请求
可以在Silverlight中直接向服务器请求数据,如下载或上传数据。有两个类可以完成此项工作,一个是WebClient类,WebClient类提供向URI标识的任何本地、Intranet或Internet资源发送数据以及从这些资源接收数据的公共方法。一个是WebRequest类,使用该请求/响应模型的应用程序可以用协议不可知的方式从Internet请求数据,在这种方式下,应用程序处理WebRequest类的实例,而协议特定的子类则执行请求的具体细节。一般使用WebClient类完成下载或上传的任务,有四个方法可用,DownloadString,UploadString分别用于下载/上传字符串数据,OpenRead、OpenWrite用于流数据的下载与上传。下述代码描述了如何从服务器获取文本内容:privatevoidStartDownload(stringurl)
{
WebClientclient=newWebClient();
client.DownloadStringCompleted+=client_DownloadStringCompleted;
client.DownloadStringAsync(newUri(url));
}
privatevoidclient_DownloadStringCompleted(objectsender,
DownloadStringCompletedEventArgse)
{
stringresult=e.Result;
//Dosomethingwiththeresult
}
对HTTP请求的更多信息参考MSDN:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- SilverLight商业应用程序开发---学习笔记(5)从服务器中获取数据之一
- Silverlight商业应用程序开发---从服务器中获取数据之一
- SilverLight商业应用程序开发---学习笔记(11)常用数据输入控件介绍
- Silverlight商业应用程序开发学习笔记(13) 数据输入验证---
- 数据输入验证---Silverlight商业应用程序开发学习笔记(13)
- SilverLight商业应用程序开发---学习笔记(10)
- SilverLight商业应用程序开发---学习笔记(3)
- SilverLight商业应用程序开发---学习笔记(11)
- SilverLight商业应用程序开发---学习笔记(7) DataGrid控件的使用
- Silverlight商业应用程序开发--学习笔记(1)
- SilverLight商业应用程序开发---学习笔记(8) 适用于SilverLight商业应用程序的几个重要的类
- SilverLight商业应用程序开发---学习笔记(9)
- SilverLight商业应用程序开发---学习笔记(2)
- Silverlight商业应用程序开发--学习笔记(1) 导航框架 navigationFramework
- SilverLight商业应用程序开发---学习笔记(4)
- SilverLight商业应用程序开发---学习笔记(2) WCF RIA服务
- SilverLight商业应用程序开发---学习笔记(9)从摘要信息跳转到详细信息 导航到细节视图 在弹出窗体打开细节视图 使用DataGrid控件的行细节显示特性显示细节内容 主/从视图的实现
- SilverLight商业应用程序开发---学习笔记(10)使用数据源窗口创建DataGrid
- MVVM设计模式相关--Silverlight商业应用程序开发学习笔记(12)
- Silverlight商业应用程序开发学习笔记(12) MVVM设计模式相关--