36
Silverlight 4 ﻧﮕﺎﺭﺵ ﭘﮋﻭﻫﺶ: ﻧﺼﻴﺮﻱ ﻭﺣﻴﺪ[email protected] ﺑﻬﺎﺭ١٣٨٩

silverlight SL04-Ch26

  • Upload
    aoe1831

  • View
    14

  • Download
    0

Embed Size (px)

DESCRIPTION

silverlight 26

Citation preview

Page 1: silverlight SL04-Ch26

را

Silverlight 4

وحيد نصيري: پژوهش و نگارش [email protected]

١٣٨٩بهار

Page 2: silverlight SL04-Ch26

Silverlight 4 ٥٣٧

فهرست مطالب Silverlight .......................................... ۵۳۸ در WCF RIA Services از استفاده – ۲۶ فصل

٥٣٨ ...................................................................................................................................................................................................... مقدمه ٥٣٨ .............................................................................................. Microsoft WCF RIA Services بر مبتني ي پروژه يك آغاز

٥٤٤ ........................................................................................................................................... DomainDataSource كنترل معرفي ٥٤٧ .................................................................................. داده منبع خودكار توليد براي VS.NET 2010 جديد امكانات از استفاده ٥٤٧ .................................................................................................................. DataGrid در شده انتخاب رديف هر جزئيات نمايش

٥٥٠ ............................................................................................................................. اطالعاتي بانك از دريافتي اطالعات روي بر جستجو ٥٥٣ .................................................................................................................................... اطالعاتي بانك از دريافتي اطالعات بندي گروه

٥٥٣ .................................................................................................................................. اطالعات فرض پيش سازي مرتب ي نحوه تعيين ٥٥٤ .................................................................................................... اطالعاتي بانك اطالعات حذف و رساني روز به ، درج عمليات انجام

٥٦٠ ........................................................................................................... WCF RIA Services در همزماني مسايل با شدن مواجه ٥٦١ .....................................................................................................................WCF RIA Services توسط كاربران سنجي اعتبار

.چاپ عمومي غير رايگان اين مطالب بدون مجوز كتبي از طرف نويسنده به هر نحوي غيرمجاز است .خذ بال مانع استأنشريات الكترونيكي با ذكر م انتشار اين مطالب بر روي اينترنت و يا استفاده از آن به صورت مستقيم و يا غير مستقيم در

Page 3: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٣٨

Silverlightدر WCF RIA Servicesاستفاده از – ۲۶فصل

مقدمه

Microsoft WCF RIA Services هاي تجاري مبتني تر و سريعتر برنامه ي ساده چارچوبي است براي توسعه Webهاي قبل با اصول كاري در طي فصل). هم نيست Silverlightو البته محدود به ( Silverlightبر

Services ،Validation ،Data binding و غيره به شكلي مجزا از هم آشنا شديم .RIA Services اين عناصري چارچوبي يكپارچه از را با ارائه Silverlightمبتني بر N-tierهاي را با هم تلفيق كرده و ساخت برنامه

نگارش . بخشد هاي سمت مشتري سهولت مي و كنترل) ASP.NETي يك برنامه در(هاي سمت سرور سرويس :توانيد دريافت كنيد نهايي يك اين محصول را از آدرس ذيل مي

http://go.microsoft.com/fwlink/?LinkID=169231 ، اين مجموعه به )مطابق توضيحات ابتداي كتاب(را پيشتر نصب كرده باشيد Silverlight 4 toolsالبته اگر

را داشته باشيد، حتما LINQ to SQLبه عالوه اگر قصد كار با . ارائه شده است WCF RIA Servicesهمراه :خواهيد داشت WCF RIA Services Toolkitنياز به

http://go.microsoft.com/fwlink/?LinkId=185121 :هاي مرتبط با اين فناوري از آدرس بعد قابل دريافت هستند اي از مثال مچنين مجموعهه

http://code.msdn.microsoft.com/RiaServices :توانيد از آدرس ذيل دريافت كنيد مي Offlineي را جهت مطالعه WCF RIA Servicesمستندات كامل

http://tinyurl.com/24bt2mz توانيد نظرات خود را در آدرس ذيل در اختيار تيم هت بهتر شدن اين پروژه داريد ميو اگر پيشنهادي ج

Silverlight قرار دهيد: http://riaservices.mswish.net/

Microsoft WCF RIA Servicesي مبتني بر آغاز يك پروژه

با يك قالب VS.NET 2010در Silverlightي جديد پس از نصب مقدمات ذكر شده، حين آغاز يك پروژه و ۱هاي شكل(مواجه خواهيم شد Microsoft WCF RIA Servicesي جديد در مورد جديد و همچنين يك گزينه

اي ، كار تنظيم خودكار ارجاعات مورد نياز را به همراه ايجاد برنامه Silverlightهاي تجاري قالب جديد برنامه). ۲

Page 4: silverlight SL04-Ch26

Silverlight 4 ٥٣٩هاي اعتبار سنجي كاربران را نيز به كند و سرويس استفاده مي Navigation frameworkكه از امكانات

) ۲شكل (ي مرتبط با آن ، انتخاب گزينهWCF RIA Servicesروش ديگر فعال سازي . دهد انجام مي همراه دارد، . است Silverlightي معمولي و متداول در حين آغاز يك پروژه

. VS.NET 2010در Silverlightهاي تجاري قالب جديد برنامه –۱شكل

. Silverlightي جديد در يك پروژه WCF RIA Servicesفعال سازي –۲شكل

ي را معرفي نمائيد تنها كافي است به برگه WCF RIA Serviceي فعلي خود يك اگر نياز است به پروژه

.مورد نظر را انتخاب كنيدي ، پروژه۳مراجعه كرده و همانند شكل Silverlightي خواص پروژه

. Silverlightي يك برنامه WCF RIA Servicesي مشخص سازي پروژه –۳شكل

Page 5: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٤٠

ي به همراه انتخاب گزينه Silverlightي ساده آغاز يك پروژه(در طي فصل جاري از روش دوم استفاده كرده در اين مثال از بانك اطالعاتي . شنا شويمتا با جزئيات بيشتري از عمليات آ) WCF RIA Servicesفعال سازي

تعدادي ركورد را از اين بانك Entity frameworkابتدا با كمك . استفاده خواهيم نمود Northwindمعروف سپس امكانات ويرايش ركوردها را فراهم خواهيم . اطالعاتي دريافت كرده و در سمت كاربر نمايش خواهيم داد

:توانيد دريافت كنيد را از آدرس ذيل مي Northwindبانك اطالعاتي . نمودhttp://tinyurl.com/7vcda

ldf.و mdf.هاي بعد فايل T-SQLتوانيد به سادگي با استفاده از اجراي دستور هاي آن مي پس از دريافت فايل :استفاده نمائيد SQL Serverرا در آن

T-SQL

exec sp_attach_db @dbname=N'Northwind', @filename1=N'C:\path\northwind.mdf', @filename2=N'C:\path\northwind.ldf'

ي افزودن آيتم جديد، يك جاري مراجعه كرده و از منوي پروژه، گزينه ASP.NETي سپس به پروژه

ADO.NET Entity Data Model را به نامNorthwindDataModel ي بعد در صفحه). ۴شكل (اضافه كنيد . ي بعد كليك نمائيد را انتخاب كرده و بر روي دكمه Generate from databaseي گزينه

. ASP.NETجديد به پروژه ADO.NET Entity Data Modelافزودن يك –۴شكل

اطالعاتي تعريف نمائيم يا از را جهت اتصال به بانك Connection stringدر ادامه نياز خواهد بود تا يك

ي اگر رشته اتصالي از قبل جهت انتخاب وجود ندارد، ابتدا بر روي دكمه. هاي ذخيره شده قبلي استفاده كنيم نمونهNew connection ي ، گزينه)۵شكل (ي باز شده كليك كرده، سپس در صفحهMicrosoft SQL Server را

) (local)براي مثال (را وارد كرده Serverي بعد نام در صفحه. مه كليك كنيدي ادا انتخاب نموده و بر روي دكمه

Page 6: silverlight SL04-Ch26

Silverlight 4 ٥٤١براي مثال حالت اعتبار سنجي يكپارچه با ويندوز كه (و نوع اعتبار سنجي مورد نظر را نيز مشخص كنيد

را از ليست مربوطه انتخاب Northwindو سپس بانك اطالعاتي ) بسيار مناسب است Intranetدر محيط يك .كنيد

. Northwindايجاد رشته اتصالي به بانك اطالعاتي –۵شكل

Connection stringي مشخص سازي توان از صفحه ي اتصالي ساخته شده مي اكنون با استفاد از اين رشته

و در ) ۶شكل (ها و محصوالت را انتخاب خواهيم نمود ي بعد دو جدول گروه در صفحه. ي بعد عبور كرد به مرحله .كليك نمائيد Finishي آخر بر روي دكمه

.Northwindها و محصوالت از بانك اطالعاتي انتخاب جداول گروه –۶شكل

Page 7: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٤٢

به صورت خودكار اسامي جمع به مفرد تبديل خواهند شد Entity framework 4دقت نمائيد در ۶اگر به شكل كند؛ زيرا مرسوم است كه از اسامي تر مي ها كار را ساده ها در طراح آن و اين مورد در حين كاركردن با موجوديت

.گردد ها استفاده مفرد بجاي اسامي جمع متناظر با جداول، جهت نامگذاري موجوديتها را نمائيد، در غير اينصورت در قسمت بعد امكان انتخاب موجوديت Compileژه را پس از اينكار يكبار پرو

.نخواهيم داشتبه اين پوشه قصد . خود اضافه نمائيد ASP.NETي به برنامه Servicesي جديد را به نام اكنون يك پوشه

WCF RIAآن به همراه قالب جديد(اضافه نمائيم ۷را مطابق شكل Domain service classداريم يك

Services نام اين كالس را ). نصب گرديده استNorthwindDomainService ي بعد درصفحه. وارد نمائيد Compileباشد به اين معنا است كه هنوز پروژه را يكبار هاي آن خالي مي اگر ليست موجوديت) ۸شكل (

در اين مثال قصد داريم تنها امكان ويرايش محصوالت . ددر اين صفحه هر دو موجوديت را انتخاب نمائي. ايد نكردهبه اين صورت . انتخاب نمائيد ۸را نيز مطابق شكل آن Enable editingي به همين جهت گزينه. را فراهم آوريم

دو كالس جديد به OKپس از كليك بر روي . متدهاي متناظر انجام اينكار به صورت خودكار تهيه خواهند شدي هاي اعتبار سنجي به آن در ادامه ، امكان افزودن ويژگي metadataعلت ايجاد كالس . فه خواهند شدبرنامه اضا

.توضيحات فصل جاري است

.جديد به پروژه Domain service classافزودن يك –۷شكل

دقت نمائيم، تنها امكان انتخاب اطالعات جدول NorthwindDomainServiceي اگر به كدهاي كالس توليد شده

ها به صورت خودكار اضافه شده است؛ اما از آنجائيكه پيشتر امكان ويرايش اطالعات جدول محصوالت را گروه .اند نيز انتخاب كرده بوديم، بنابراين متدهاي متناظر افزودن، ويرايش و حذف اطالعات آن نيز فراهم شده

Page 8: silverlight SL04-Ch26

Silverlight 4 ٥٤٣ نام دارد كه پس از SilverlightApplicationXYZ.Web.Servicesهاي اضافه شده فضاي نام كالس

Compile ي پروژه به سادگي و بدون نياز به هيچ نوع تمهيدات ديگري در برنامهSilverlight قابل استفاده .خواهد بود

.جديد Domain service classي تنظيمات يك صفحه –۸شكل

را از جعبه ابزار آن كشيده و بر DataGridرل جاري رجوع كرده و يك كنت Silverlightي اكنون به پروژه

ي صفحه XAMLكدهاي . روي فرم رها كنيد تا ارجاعات الزم به آن به صورت خودكار به پروژه اضافه شوند :اصلي پروژه اكنون به صورت زير خواهند بود

MainPage.xaml

<UserControl x:Class="SilverlightApplication101.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc= "http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400" xmlns: sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> <Grid x:Name="LayoutRoot" Background="White"> <sdk:DataGrid Name="dataGrid1" /> </Grid> </UserControl>

Page 9: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٤٤

WCF RIA Service، اطالعات mainPageLoadedسپس فقط با استفاده از سه سطر كد نويسي در متد :نمايش خواهيم داد DataGrid خود را دريافت و توسط كنترل

MainPage.xaml.cs

using System.Windows; using SilverlightApplication101.Web.Services; namespace SilverlightApplication101 { public partial class MainPage { public MainPage() { InitializeComponent(); this.Loaded += mainPageLoaded; } void mainPageLoaded(object sender, RoutedEventArgs e) { var ctx = new NorthwindDomainContext(); ctx.Load(ctx.GetProductsQuery()); dataGrid1.ItemsSource = ctx.Products; } } }

NorthwindDomainContext ي تعريف شده در پروژهASP.NET تنها پس از افزودن سطر فضاي نام WCFها و متدهاي اين توان به كالس از اين طريق مي. متناظر با آن به كالس جاري، قابل استفاده خواهد بود

RIA Service دسترسي داشت. libraryنهايي با استفاده از ويژگي XAPها كانديداي مناسب جهت انتخاب كاهش حجم فايل اين نوع پروژه

caching باشند كه در مورد آن در طي فصول قبل بيشتر توضيح داده شد مي. را مرور در ادامه، مباحث تكميلي آن. آشنا شديم WCF RIA Servicesتا اينجا با اصول مقدماتي كار با

.خواهيم نمود

DomainDataSourceمعرفي كنترل

به جعبه ابزار DomainDataSourceديدي به نام ، كنترل ج WCF RIA Servicesي پس از نصب مجموعه VS.NET اين . اي نمايش و كار با اطالعات استفاده خواهيم كرد اضافه خواهد شد كه از آن جهت تامين منبع داده

هاي آن و همچنين كشيده و بر روي فرم رها كنيد تا ارجاعات الزم به اسمبلي VS.NETكنترل را از جعبه ابزار . ي جاري برنامه اضافه شوند به پروژه و صفحه) riaControlsبا نام مستعار (تناظر با آن فضاهاي نام م

Page 10: silverlight SL04-Ch26

Silverlight 4 ٥٤٥

و NorthwindDomainContextاكنون قصد داريم بجاي روش مثال قبل، بدون استفاده از كد نويسي، مثال قبل را mainPageLoadedبه همين منظور متد . قرار دهيم DataGridكوئرهاي مربوطه را در اختيار كنترل

:برنامه را به صورت بعد تغيير دهيد XAMLحذف كرده و كدهاي MainPage.xaml

<UserControl x:Class="SilverlightApplication101.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc= "http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400" xmlns: sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:riaControls= "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" xmlns:localServices= "clr-namespace:SilverlightApplication101.Web.Services" xmlns:my="clr-namespace:SilverlightApplication101.Web"> <StackPanel> <riaControls:DomainDataSource Name="nwProducts" LoadSize="4" LoadDelay="0:0:0.25" PageSize="10" d:DesignData= "{d:DesignInstance my:Product, CreateList=true}" LoadedData="productDomainDataSource_LoadedData" QueryName="GetProductsQuery" AutoLoad="True"> <riaControls:DomainDataSource.DomainContext> <localServices:NorthwindDomainContext /> </riaControls:DomainDataSource.DomainContext> </riaControls:DomainDataSource> <sdk:DataGrid Name="dataGrid1" ItemsSource="{Binding Path=Data, ElementName=nwProducts}" Width="Auto" AutoGenerateColumns="True" Height="200" /> <sdk:DataPager Source="{Binding Path=Data, ElementName=nwProducts}" PageSize="10" /> </StackPanel> </UserControl>

Page 11: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٤٦

:توضيحاتپس از كشيدن و رها كردن VS.NETهاي اضافه شده به صورت خودكار توسط فضاهاي نام متناظر با كنترل

به صورت WCF RIA Serviceهاي تنها دو فضاي نام مرتبط با كالس. اند ها بر روي صفحه ايجاد شده آن .اند دستي اضافه شده

. تعريف شده است DomainDataSourceابتدا نياز است تا منبع داده مشخص شود؛ به همين جهت كنترل كه در طي يك حلقه غيرهمزمان هربار چند ركورد از بانك اطالعاتي كند آن مشخص مي LoadSizeخاصيت

. مشخص شده است LoadDelayفواصل زماني اين دريافت اطالعات توسط خاصيت . دريافت و نمايش داده شودويژگي . استفاده خواهيم كرد DataGridدر ادامه جهت صفحه بندي اطالعات PageSizeاز خاصيت DesignData هاي نهايي شدن ستون سبب نمايانDataGrid خواهند شد .QueryName نيز متناظر است با نام

DomainContextدر ادامه روش معرفي . به صورت خودكار توليد شدند WCF RIA Serviceمتدهايي كه در هاي ترلرا به كن آن Bindingپس از مشخص شدن منبع داده مورد استفاده، با كمك عمليات . فرمائيد را مالحظه مي

DataGrid و همچنينDataPager ايم معرفي كرده. از اين جهت اضافه شده است كه اگر در حين بارگذاري اطالعات خطايي رخ LoadedDataروال رخداد گردان

.داد، بتوان مشكالت موجود را بهتر دريافت نمودMainPage.xaml.cs

using System.Windows; using System.Windows.Controls; namespace SilverlightApplication101 { public partial class MainPage { public MainPage() { InitializeComponent(); } private void productDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e) { if (e.HasError) { MessageBox.Show(e.Error.ToString(), "Load Error", MessageBoxButton.OK); e.MarkErrorAsHandled(); } } } }

Page 12: silverlight SL04-Ch26

Silverlight 4 ٥٤٧ي به همين جهت به پروژه. ما مرتب شده باشد LINQبراي صفحه بندي نياز است تا خروجي كوئري

ASP.NET مراجعه كرده و تغيير ذيل را اعمال نمائيد: NorthwindDomainService.cs

public IQueryable<Product> GetProducts() { return this.ObjectContext.Products.OrderBy(a=>a.ProductName); }

براي توليد خودكار منبع داده VS.NET 2010استفاده از امكانات جديد

VS.NET 2010هاي جديد اين مورد جزو ويژگي. توان انجام داد تمام اين عمليات را به صورت خودكار نيز مي Show Dataي گزينه Dataمنوي (رجوع كرده ) ۹شكل ( Data Sourcesي براي اين منظور به برگه. است

Sources(ها تشخيص داده شوند ، اندكي صبر كنيد تا به صورت خودكار اطالعات موجوديت .

. VS.NET 2010در Data Sourcesي برگه –۹شكل

به صورت . نيدكشيده و بر روي فرم برنامه رها ك Data Sourcesي را از برگه Productسپس موجوديت

ها به صفحه اضافه شده و همچنين تنظيمات ابتدايي آن DataGridو DomainDataSourceخودكار دو كنترل هاي آن به صورت خودكار تشكيل تر بوده و قالب ستون حاصل نيز بسيار شكيل DataGrid. نيز انجام خواهد شد

Productتوان با كشيدن و رها كردن موجوديت مي را نيز DataPagerمربوط به Bindingحتي كدهاي . اند شده .به صورت خودكار ايجاد نمود DataPagerبر روي كنترل

DataGridنمايش جزئيات هر رديف انتخاب شده در

را در پايين ، جزئيات فيلدهاي آن DataGridي مثال قبل، قصد داريم پس از انتخاب هر رديف در در ادامه

Dataي به برگه. استفاده خواهيم كرد VS.NET 2010براي سهولت كار، از امكانات جديد . صفحه نمايش دهيم

Sources مراجعه كرده و بر روي موجوديتProduct حالت پيش فرض آن، ). ۱۰شكل (كليك كنيدDataGrid

Page 13: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٤٨

وجوديت را انتخاب كنيد، سپس م Detailsاكنون ابتدا حالت . است كه پيشتر در مورد آن توضيح داده شدProduct به اين صورت يك . را كشيده و بر روي فرم رها نمائيدGrid نمايانگر جزئيات تك تك فيلدهاي

توان را به سادگي مي Gridاين XAMLبديهي است كدهاي . شود به صفحه اضافه مي Productموجوديت خواهيم جزئيات رديف انتخاب شده براي مثال از آنجائيكه مي. ويرايش كرد و تغييرات دلخواه را به آن اعمال نمود

:جديد اعمال كنيد Gridجديد مشاهده كنيم، تغيير ذيل را به اين Gridرا در اين DataGridدر MainPage.xaml

... <Grid DataContext="{Binding ElementName=dataGrid1, Path=SelectedItem}" ...

.توانيد مشاهده نمائيد مي ۱۱ي حاصل را در شكل نتيجه

امكان انتخاب جزئيات فيلدهاي يك كالس جهت نمايش –۱۰شكل

براي مثال عالقمند باشيد تعدادي را . هاي پيش فرضي كه در اين حالت توليد شدند راضي نباشيد شايد از كنترل

ويرايش دستي كدهاي . دو راه براي انجام اينكار وجود دارد. نمايش دهيد و غيره TextBlockبه صورت XAML ي حاصل و يا مجددا به برگهData Sources ي ار گزينهمراجعه كنيد؛ اينبProduct شكل (را گشوده

اگر كنترل (توان كنترل پيش فرض را تغيير داد با انتخاب هر فيلد مي. و فيلدهاي مورد را نظر را انتخاب كنيد) ۱۲كليك كرده و كنترل دلخواه خود را Customizeي مورد نظر شما در منو نمايش داده نشده است بر روي گزينه

هاي جديد را كشيده و بر روي فرم رها كنيد، از كنترل Productاكنون اگر مجددا موجوديت ). انتخاب نمائيد .انتخابي استفاده خواهد شد

Page 14: silverlight SL04-Ch26

Silverlight 4 ٥٤٩

. DataGridنمايي از نمايش جزئيات يك رديف انتخاب شده در –۱۱شكل

. Detailsهاي پيش فرض نمايش داده شده در حالت انتخاب امكان تغيير كنترل –۱۲شكل

Page 15: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٥٠

عات دريافتي از بانك اطالعاتيجستجو بر روي اطال

به همين . فرض كنيد در مثال قبل قصد داريم امكانات جستجو بر اساس نام محصوالت را نيز اضافه كنيم را مطابق كدهاي بعد به كالس آن LINQمراجعه كرده و كوئري ASP.NETي ه منظور ابتدا به پروژ

NorthwindDomainService از افزودن متد پس. اضافه خواهيم نمودGetProductsStartsWith ،Compile .پروژه را فراموش نكنيد

NorthwindDomainService.cs

public IQueryable<Product> GetProductsStartsWith(string name) { return this.ObjectContext.Products.Where( a => a.ProductName.StartsWith(name)); }

توان كوئري را باز نمائيم ، مي Data Sourcesي رجوع كرده و مجددا برگه Silverlightي اكنون اگر به پروژه

LINQ ابتدا حالت انتخابي را بر روي ). ۱۳شكل (جديد را مشاهده نمودDataGrid قرار دهيد، سپس كوئريGetProductsStartsWithQuery توان مجددا موجوديت حال مي. را انتخاب نمائيدProduct را از اين برگه

اين بار به صورت خودكار قسمت جستجوي برنامه نيز تشكيل . كشيده و بر روي يك فرم جديد برنامه رها كرد ).۱۴شكل (خواهد شد

. DataGridجديد به عنوان منبع داده LINQامكان انتخاب كوئري –۱۳شكل

:حائز اهميت است DomainDataSourceي تعريف و ارسال پارامتر به كنترل اين مثال از لحاظ نحوه

SrchPage.xaml

<riaControls:DomainDataSource AutoLoad="False"

Page 16: silverlight SL04-Ch26

Silverlight 4 ٥٥١ d:DesignData="{d:DesignInstance my:Product, CreateList=true}"

Height="0" LoadedData="productDomainDataSource_LoadedData" Name="productDomainDataSource" QueryName="GetProductsStartsWithQuery" Width="0"> <riaControls:DomainDataSource.DomainContext> <my1:NorthwindDomainContext /> </riaControls:DomainDataSource.DomainContext> <riaControls:DomainDataSource.QueryParameters> <riaControls:Parameter ParameterName="name" Value="{Binding ElementName=nameTextBox, Path=Text}" /> </riaControls:DomainDataSource.QueryParameters> </riaControls:DomainDataSource>

قرار گرفته بر TextBoxرا از يك كنترل در اينجا روش تعريف يك پارامتر جديد و همچنين دريافت اطالعات آن

.توان مالحظه نمود روي صفحه مي

تشكيل خودكار فرم جستجوي اطالعات در بانك اطالعاتي –۱۴شكل

استفاده گردد AutoCompleteBoxساده نياز است تا از يك TextBoxدر اين مثال فرض كنيد بجاي يك را بر اساس ليست محصوالت تشكيل داده و DomainDataSourceبراي اين منظور يك كنترل ). ۱۵شكل (

:خواهيم گذاشت AutoCompleteBoxترل را در اختيار كن اطالعات آنSrchPage2.xaml

... <riaControls:DomainDataSource AutoLoad="True" d:DesignData= "{d:DesignInstance my:Product, CreateList=true}"

Page 17: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٥٢

Height="0" LoadedData="productDomainDataSource_LoadedData" Name="productDomainDataSource" QueryName="GetProductsQuery" Width="0"> <riaControls:DomainDataSource.DomainContext> <my1:NorthwindDomainContext /> </riaControls:DomainDataSource.DomainContext> </riaControls:DomainDataSource> ... <sdk:AutoCompleteBox Height="28" FilterMode="StartsWith" ItemsSource= "{Binding Data, ElementName=productDomainDataSource}" ValueMemberBinding="{Binding ProductName}" Name="nameTextBox" Width="120" /> ...

. DomainDataSourceبه همراه كنترل AutoCompleteBoxاستفاده از –۱۵شكل

جديد و سپس معرفي پارامتر متد مرتبط به آن توسط اشياء LINQدر اين مثال با استفاده از تعريف يك كوئري

QueryParameters روش ديگري نيز . هاي بانك اطالعاتي انجام دهيم ، توانستيم جستجوي خود را بر روي داده :باشد مي FilterDescriptorsم اينكار وجود دارد و آن استفاده از اشياء براي انجا

SrchPage2.xaml

... <riaControls:DomainDataSource ... <riaControls:DomainDataSource.FilterDescriptors> <riaControls:FilterDescriptor PropertyPath="ProductName" Operator="Contains" Value="{Binding ElementName=nameTextBox, Path=Text}" />

Page 18: silverlight SL04-Ch26

Silverlight 4 ٥٥٣ </riaControls:DomainDataSource.FilterDescriptors>

... </riaControls:DomainDataSource> ...

ي جستجو تعيين شده و در نهايت سپس نحوه. شود جستجو مشخص ميدر اينجا خاصيت مورد نظر جهت در . دريافت شود Bindingتواند مقداري ثابت باشد يا از طريق عمليات مقدار دريافتي بايد دقيقا ذكر گردد؛ كه مي

ي جستجو به صورت خودكار برنامه داده شود، نتيجه TextBoxمثال فوق به ازاي هر تغييري كه در مقادير هم دريافت Bindingتوان از طريق را نيز مي PropertyPathبديهي است مقدار خاصيت . نمايش داده خواهد شد

ذكر شوند و سپس بر اين اساس جستجو انجام ComboBoxبراي مثال ليستي از فيلدهاي يك جدول در يك . كرد :گردد

PropertyPath="{Binding ElementName=ComboBox1, Path=SelectedItem.Content}"

گروه بندي اطالعات دريافتي از بانك اطالعاتي

موفق به گروه بندي اطالعات و نمايش PagedCollectionViewهاي قبل با استفاده از اشياء در طي فصل DomainDataSourceترل در اين فصل نيز گروه بندي اطالعات توسط كن. شديم DataGridها در كنترل آن

:را به صورت ذيل تغيير دهيد DomainDataSourceبراي نمونه در مثال قبل، تعريف . شود پشتيباني ميSrchPage2.xaml

... <riaControls:DomainDataSource ... <riaControls:DomainDataSource.GroupDescriptors> <riaControls:GroupDescriptor PropertyPath="CategoryID" /> </riaControls:DomainDataSource.GroupDescriptors> ... </riaControls:DomainDataSource> ...

كمك گرفت و سپس GroupDescriptorنمائيد براي گروه بندي اطالعات بايد از اشياء همانطور كه مالحظه مي .آن ذكر كرد PropertyPathد مورد نظر را در ويژگي فيل

ي مرتب سازي پيش فرض اطالعات تعيين نحوه به صورت پيش فرض و بدون كد نويسي خاصي امكانات مرتب سازي اطالعات را در DataGridهرچند كنترل

عات بر اساس خاصيت يا دهد اما شايد عالقمند باشيم كه در اولين بار نمايش آن، اطال اختيار ما قرار مي

Page 19: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٥٤

مانند مثال (را تدارك ديد آن LINQتوان كوئري براي اين منظور يا مي. هاي مشخصي مرتب شده باشند خاصيتدر مثال بعد . استفاده كرد DomainDataSourceكنترل SortDescriptorsو يا از اشياء ) صفحه بندي اطالعات

مشخص سازي فيلد مورد نظر و صعودي يا نزولي بودن مرتب ، روش SortDescriptorsي معرفي اشياء نحوه :اند سازي نيز بيان شده

SrchPage2.xaml

... <riaControls:DomainDataSource ... <riaControls:DomainDataSource.SortDescriptors> <riaControls:SortDescriptor PropertyPath="ProductName" Direction="Ascending" /> </riaControls:DomainDataSource.SortDescriptors> ... </riaControls:DomainDataSource> ...

انجام عمليات درج ، به روز رساني و حذف اطالعات بانك اطالعاتي

WCF، با استفاده از امكانات Northwindي مثال كار با بانك اطالعاتي خواهيم در ادامه در اين قسمت مي

RIA Services اطالعات دريافتي را در يك ،DataGrid نمايش داده و سپس هر رديف انتخابي را به يك كنترلDataForm سناريوي (هاي قبل مقيد نمائيم معرفي شده در فصلMaster-Details .( درج ، سپس اعمال متداول

، صفحه DataFormمزيت استفاده از كنترل . را پياده سازي كنيم به روز رساني و حذف اطالعات بانك اطالعاتيبندي ركوردهاي دريافتي، يكپارچگي عمليات اعتبار سنجي و موارد ديگري است كه در طي فصل اختصاص داده

و VS.NET 2010بته همانطور كه پيشتر نيز ذكر شد با استفاده از امكانات جديد ال. شده به آن بررسي گرديدندتوان با كشيدن و رها كردن يك ، به سادگي مي Data Sourcesي در برگه Detailsي مراجعه به حالت ويژه

ني بانك ي جاري برنامه، فرم متناظري از آن را تشكيل داد و سپس اعمال به روز رسا موجوديت بر روي صفحه .اطالعاتي را بر اين اساس تعريف كرد

كدهاي . ايم ي جاري اضافه كرده به پروژه CRUD.xamlجديد را به نام User controlبراي اين منظور يك XAML را در ادامه مالحظه خواهيد نمود آن:

CRUD.xaml

<UserControl x:Class="SilverlightApplication101.CRUD" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

Page 20: silverlight SL04-Ch26

Silverlight 4 ٥٥٥ xmlns:mc=

"http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400" xmlns:riaControls= "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" xmlns:my="clr-namespace:SilverlightApplication101.Web" xmlns:my1="clr-namespace:SilverlightApplication101.Web.Services" xmlns:sdk= "http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:toolkit= "http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"> <toolkit:BusyIndicator Height="auto" Name="busyIndicator1" Width="310" IsBusy="{Binding Path=IsBusy, ElementName=productDomainDataSource}" HorizontalAlignment="Left"> <StackPanel> <riaControls:DomainDataSource AutoLoad="True" d:DesignData= "{d:DesignInstance my:Product, CreateList=true}" Height="0" LoadedData="productDomainDataSource_LoadedData" Name="productDomainDataSource" QueryName="GetProductsQuery" Width="0"> <riaControls:DomainDataSource.DomainContext> <my1:NorthwindDomainContext /> </riaControls:DomainDataSource.DomainContext> </riaControls:DomainDataSource> <sdk:DataGrid AutoGenerateColumns="False" Height="150" HorizontalAlignment="Left" ItemsSource= "{Binding ElementName=productDomainDataSource, Path=Data}" Margin="5" Name="productDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="300"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn x:Name="productIDColumn" Binding="{Binding Path=ProductID, Mode=OneWay}" Header="Product ID" IsReadOnly="True" Width="SizeToHeader" /> <sdk:DataGridTextColumn x:Name="productNameColumn" Binding="{Binding Path=ProductName}"

Page 21: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٥٦

Header="Product Name" Width="SizeToHeader" /> </sdk:DataGrid.Columns> </sdk:DataGrid> <sdk:DataPager Source= "{Binding Data, ElementName=productDomainDataSource}" PageSize="5" /> <toolkit:DataForm Header="Product Details" AutoCommit="True" AutoEdit="False" CommandButtonsVisibility="All" CurrentItem= "{Binding Path=SelectedItem, ElementName=productDataGrid}" ItemsSource= "{Binding Path=Data, ElementName=productDomainDataSource}" EditEnded="dataForm1_EditEnded" DeletingItem="dataForm1_DeletingItem" AddingNewItem="dataForm1_AddingNewItem" HorizontalAlignment="Left" Margin="5" Height="Auto" Name="dataForm1" Width="300" /> </StackPanel> </toolkit:BusyIndicator> </UserControl>

:توضيحاتاين صفحه به صورت خودكار با كشيدن و DataGridو DomainDataSourceكدهاي مرتبط با كنترل •

VS.NET 2010ي جاري در بر روي صفحه Data Sourcesي از برگه Productرها كردن موجوديت .ها پيشتر توضيح داده شد اند كه در مورد آن توليد شده

شيء IsBusyمقيد شده به خاصيت BusyIndicatorتمام كدهاي صفحه را داخل يك كنترل •DomainDataSourceبه اين صورت در زمان بارگذاري اوليه صفحه يا ذخيره سازي . ايم ، قرار داده

.، كاربر متوجه طول عمليات خواهد گرديد Serverاطالعات در

به صفحه اضافه شده DataGridنيز جهت نمايش زيباتر و صفحه بندي اطالعات DataPagerكنترل •مقيد productDomainDataSourceشيء Dataبه خاصيت آن Sourceهمچنين خاصيت . است

.گرديده است

. مديريت خواهد شد DataFormقسمت اصلي كار افزودن، ويرايش و حذف ركوردها توسط كنترل •ايم تا پس از تغييرات و مراجعه به ركورد بعدي، تنظيم كرده Trueرا به آن AutoCommitخاصيت

Page 22: silverlight SL04-Ch26

Silverlight 4 ٥٥٧همچنين يك سري روال رخدادگردان نيز براي مديريت . رددها فراهم گ امكان ثبت خودكار آن

آن با رديف جاري CurrentItemخاصيت . اعمال ويرايش ، ثبت و حذف اطالعات اضافه شده استآن اطالعات خود را ItemsSourceويژگي . مقدار دهي گرديده است DataGridانتخاب شده در كنترل

.كند افت ميدري productDomainDataSourceاز كنترل

:را مشاهده خواهيد نمود Viewدر ادامه كدهاي متناظر با اين CRUD.xaml.cs

using System.ComponentModel; using System.Windows; using System.Windows.Controls; namespace SilverlightApplication101 { public partial class CRUD { public CRUD() { InitializeComponent(); this.Loaded += crudLoaded; } void crudLoaded(object sender, RoutedEventArgs e) { productDomainDataSource.SubmittedChanges += productDomainDataSource_SubmittedChanges; } static void productDomainDataSource_SubmittedChanges( object sender, SubmittedChangesEventArgs e) { if (e.HasError) { MessageBox.Show(e.Error.ToString(), "SubmittedChanges Error", MessageBoxButton.OK); e.MarkErrorAsHandled(); } else { MessageBox.Show("Submitted!"); } } private void productDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e) { if (e.HasError)

Page 23: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٥٨

{ MessageBox.Show(e.Error.ToString(), "Load Error", MessageBoxButton.OK); e.MarkErrorAsHandled(); } } private void dataForm1_EditEnded(object sender, DataFormEditEndedEventArgs e) { if (e.EditAction != DataFormEditAction.Commit) return; //save to db (add new item / edit current item) if (!productDomainDataSource.IsSubmittingChanges && productDomainDataSource.HasChanges) { productDomainDataSource.SubmitChanges(); } } private void dataForm1_DeletingItem(object sender, CancelEventArgs e) { var res = MessageBox.Show( "Do you want to delete this item?", "DeletingItem", MessageBoxButton.OKCancel); if (res == MessageBoxResult.Cancel) { e.Cancel = true; return; } if (productDomainDataSource.DataView.CanRemove) { var currentItem = productDomainDataSource.DataView.CurrentItem; productDomainDataSource.DataView.Remove(currentItem); productDomainDataSource.SubmitChanges(); } } private void dataForm1_AddingNewItem(object sender, DataFormAddingNewItemEventArgs e) { //save to db if (productDomainDataSource.DataView.CanAdd &&

Page 24: silverlight SL04-Ch26

Silverlight 4 ٥٥٩ productDomainDataSource.HasChanges)

{ productDomainDataSource.SubmitChanges(); } } } }

:توضيحات

اگر حين عمليات كار با بانك اطالعاتي . است تعريف شده SubmittedChangesابتدا روال رخدادگردان •همچنين به كمك متد . توان جزئيات خطا را دريافت كرد خطايي رخ دهد به اين ترتيب مي

MarkErrorAsHandled به برنامه اعالم خواهيم نمود كه لطفا در اثر بروز خطا به كار خود پايان .ندهيد

كار مديريت ثبت تغييرات ركوردهاي اضافه شده يا dataForm1_EditEndedروال رخدادگردان •در اينجا ابتدا بايد بررسي كرد كه آيا واقعا تغييري رخ داده . دهد ركورد جاري ويرايش شده را انجام مي

و آيا كنترل ) productDomainDataSourceشيء HasChangesبه كمك خاصيت (است productDomainDataSource بررسي (به روز رساني بانك اطالعاتي نيست هم اكنون مشغول

را جهت ثبت نهايي عمليات در آن SubmitChanges، سپس متد )IsSubmittingChangesخاصيت .بانك اطالعاتي فراخواني خواهيم كرد

پيش از حذف يك ركورد و در حين انجام اين عمليات dataForm1_DeletingItemروال رخدادگردان •توان ابتدا تائيد كاربر را در اين زمينه اخذ كرد و سپس نسبت به حذف بنابراين مي .گردد فراخواني مي

شيء DataViewبراي اين منظور از امكانات كالس . ركورد جاري اقدام نمودproductDomainDataSource ابتدا وضعيت جاري بررسي شده و شيء در حال . استفاده خواهد شد

يء حذف شده و نهايتا تغييرات در بانك اطالعاتي دائمي خواهد شد سپس اين ش. گردد حذف دريافت مي ).فراخواني نشده است، تغييرات دائمي نخواهند شد SubmitChangesتا زمانيكه متد (

انجام عمليات متداول كار با بانك اطالعاتي را به شدت تسهيل DataFormكنيد كنترل همانطور كه مالحظه مي . بخشد مياگر عالقمند باشيد كه قيود اعتبار سنجي ويژه خود را تعريف نمائيد بايد به كالس

NorthwindDomainService.metadata.cs ي در پروژهASP.NET توان در اينجا مي. برنامه رجوع كرد Dataاز Silverlightهاي اعتبار سنجي در همانند مباحث مطرح شده در طي فصل آشنايي با روش

annotations مناسب و مورد نظر خود استفاده نمود.

Page 25: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٦٠

WCF RIA Servicesمواجه شدن با مسايل همزماني در

ي جديد از يا در دو صفحه(دو وهله از اين برنامه را در دو مرورگر مختلف باز كنيد . مثال قبل را در نظر بگيريد . عمليات را در مرورگر دوم نيز تكرار نمائيد همين. در يك مرورگر نام محصولي را ويرايش كنيد). يك مرورگر

به عبارت ديگر كاربر دوم متوجه نخواهد شد كه اطالعات ركورد مورد نظر پيشتر . خطايي را دريافت نخواهيد كرد .توسط كاربر ديگري ويرايش شده يا تغيير كرده است

). ۱۶شكل (را باز نمائيد و طراح آنمراجعه كرده NorthwindDataModel.edmxبراي رفع اين مشكل به فايل Concurrency modeي خواص آن، مقدار خاصيت را انتخاب كرده و سپس در برگه ProductNameخاصيت

.نمائيد تا تغييرات اعمال شوند Compileاكنون يكبار ديگر پروژه را . تغيير دهيد Fixedبه Noneرا از

.تغيير حالت همزماني فيلد نام محصول –۱۶شكل

ي سپس به وهله. ي اول نام يك محصول را ويرايش كنيد در وهله. سپس مجددا دو وهله از برنامه را اجرا نمائيد

بالفاصله پيغام تداخل را دريافت خواهيد . دوم برنامه رجوع كرده و سعي نمائيد نام قبلي موجود را ويرايش نمائيدتوان پيغامي را مبني بر تغييرات اطالعات توسط كاربرهاي ديگر و به روز رساني منبع ن موارد ميدر اي. كرد .اي با اطالعات جديد، درنظر گرفت داده

Page 26: silverlight SL04-Ch26

Silverlight 4 ٥٦١

WCF RIA Servicesاعتبار سنجي كاربران توسط

ASP.NET بر اساس امكانات اعتبار سنجي WCF RIA Servicesاعتبار سنجي كاربران در حين استفاده از باشد كه در مي Membership frameworkو Windows authentication ،Forms Authenticationمانند

اگر . بيشتر آشنا شديم Forms authenticationي تعريف و استفاده از با نحوه Silverlightطي فصل امنيت در به صورت انتخاب كرده باشيد، Silverlightي هاي تجار خود را از نوع قالب جديد برنامه Silverlightي پروژه

برنامه Servicesي را در پوشه UserRegistrationServiceو AuthenticationServiceپيش فرض دو كالس ASP.NET اساس كار آن استفاده از سيستم . توانيد پيدا كنيد پروژه ميMembership تعريف شده درASP.NET ي ي نيز اگر به پروژهبه عالوه در سمت مشتر. استSilverlight ها و صفحات دقت نمائيد فايل

login ي در پوشه(و ثبت نام كاربرViews\Login (اند و بدون نياز به تنظيم به صورت خودكار اضافه شدهرا پيشتر نصب و فعال ASPNET_Membershipفقط بايد بانك اطالعاتي سيستم (خاصي كار خواهند كرد

).كرده باشيد WCF RIAايم با سيستم اعتبار سنجي داده ي فصل را كه تاكنون توسعه در ادامه قصد داريم برنامه

Services هاي تجاري يكپارچه كنيم و جهت توضيحات بيشتر از قالب جديد برنامهSilverlight استفاده نخواهيم .نيز مد نظر نخواهد بود ASPNET_Membershipكرد و همچنين روش استفاده از

.جديد Authentication domain serviceتعريف يك كالس –۱۷شكل

ي در برنامه Servicesي جديد را به پوشه AuthenticationDomainServiceبراي اين منظور بايد يك كالس

ASP.NET حت قسمت ي افزودن يك آيتم جديد، ت از منوي پروژه گزينه). ۱۷شكل (اضافه كردWeb قالب ،Authentication domain service را انتخاب نموده و سپس نام

NorthwindAuthenticationDomainService ي را وارد كرده و بر روي دكمهOK اگر سيستم . كليك كنيد

Page 27: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٦٢

تعاريف پيش فرض اين كالس كفايت كرده و كند، استفاده مي ASPNET_Membershipجاري شما از روش سفارشي Forms Authenticationاما در اينجا قصد داريم از يك روش . زي به هيچگونه تغييري در آن نيستنيا

مورد استفاده قرار گيرد بايد اين نوع Forms Authenticationپيش از آنكه اين روش سفارشي . استفاده كنيم :برنامه فعال كرد Web.configاعتبار سنجي را در فايل

Web.config

... <system.web> <authentication mode="Forms"> <forms name=".403AuthRia" /> </authentication> ...

كدهاي اين روش سفارشي . كنيم) override(را تحريف AuthenticationBaseسپس بايد متدهاي كالس پايه .در ادامه ذكر شده است

NorthwindAuthenticationDomainService.cs

using System; using System.Security.Principal; using System.ServiceModel.DomainServices.Hosting; using System.ServiceModel.DomainServices.Server.ApplicationServices; using System.Web; using System.Web.Security; namespace SilverlightApplication101.Web.Services { [EnableClientAccess] public class NorthwindAuthenticationDomainService : AuthenticationBase<User> { protected override bool ValidateUser( string userName, string password) { if (string.IsNullOrWhiteSpace(userName)) return false; if (userName == password) { //todo: read from db... return true; } return false; }

Page 28: silverlight SL04-Ch26

Silverlight 4 ٥٦٣ protected override void IssueAuthenticationToken(

IPrincipal principal, bool isPersistent) { //using named parameters of C# 4.0 var ticket = new FormsAuthenticationTicket ( version: 1, name: principal.Identity.Name, issueDate: DateTime.Now, //todo: read it from config... expiration: DateTime.Now.AddMonths(1), isPersistent: true, userData: string.Empty, cookiePath: FormsAuthentication.FormsCookiePath ); string encryptedTicket = FormsAuthentication.Encrypt(ticket); var cookie = new HttpCookie( FormsAuthentication.FormsCookieName, encryptedTicket) { Expires = DateTime.Now.AddMinutes(30) }; HttpContext.Current.Response.Cookies.Add(cookie); } protected override User GetAuthenticatedUser( IPrincipal principal) { return new User { EmployeeId = principal.Identity.Name, Name = principal.Identity.Name, Roles = MyRoleManager.GetRoles( principal.Identity.Name) }; } } public class User : UserBase { public string EmployeeId { get; set; } } public class MyRoleManager { public static string[] GetRoles(string userName)

Page 29: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٦٤

{ //todo: read from db... return new[] { "Reader" }; } } }

:توضيحاتدر سمت مشتري كه در ادامه در مورد آن توضيح داده خواهد شد، ابتدا متد Loginبا استفاده از متد •

ValidateUser ي در اينجا فرصت خواهيد داشت تا نام كاربري و كلمه. گردد اين كالس فراخواني مي .عبور او را با اطالعات موجود در يك بانك اطالعاتي دلخواه مقايسه نمائيد و نتيجه را بازگشت دهيد

ش توان يك كوكي ماندگار رو در اينجا مي. گردد فراخواني مي IssueAuthenticationTokenسپس متد • .را صادر كرد Formsاعتبار سنجي مبتني بر

اگر نياز به . گردد فراخواني مي GetAuthenticatedUserو در پايان عمليات به صورت خودكار متد •ذكر شده Userرا به كالس )ها(توان آن اضافه كردن فيلدي سفارشي در اينجا وجود داشته باشد مي

.قرار گيرد اضافه كرد تا در اختيار برنامه سمت مشتري

اكنون نوبت به . رسد جهت فعال سازي اعتبارسنجي سفارشي به پايان مي Serverتا اينجا تنظيمات سمت مراجعه كرده و كدهاي متد App.xaml.csبه فايل . است Silverlightي تنظيمات برنامه

setAuthenticationContext زير را به آن اضافه كنيد: App.xaml.cs

using System; using System.ServiceModel.DomainServices.Client.ApplicationServices; using System.Windows; namespace SilverlightApplication101 { public partial class App { public App() { ... setAuthenticationContext(); } private void setAuthenticationContext() { var webcontext = new WebContext { Authentication =

Page 30: silverlight SL04-Ch26

Silverlight 4 ٥٦٥ new FormsAuthentication()

}; this.ApplicationLifetimeObjects.Add(webcontext); } ...

:است App.XAMLو يا روش دوم انجام اينكار افزودن چند سطر بعد به فايل App.xaml.cs

... <Application.ApplicationLifetimeObjects> <app:RiaContext> <app:RiaContext.Authentication> <appsvc:FormsAuthentication/> <!--<appsvc:WindowsAuthentication/>--> </app:RiaContext.Authentication> </app:RiaContext> </Application.ApplicationLifetimeObjects> ...

كنيد در اينجا امكان تنظيم روش اعتبار سنجي مبتني بر ويندوز نيز وجود دارد و در اين همانطور كه مالحظه مي

كفايت كرده و نياز به تغييرات NorthwindAuthenticationDomainServiceحالت نيز همان كالس ابتدايي بديهي است در اين روش . يكپارچه است Active directoryاين روش به صورت پيش فرض، با . خاصي ندارد

:را به شكل بعد ويرايش نمود ASP.NETبرنامه Web.Configبايد اندكي Web.config

... <system.web> <authentication mode="Windows"/> ...

تنها كافي است متد ذيل را جهت دريافت اطالعات كاربر جاري وارد شده به App.XAML.csو در فايل :، فراخواني نمود Active directoryسيستم از

App.XAML.CS

... public App() { ... WebContext.Current.Authentication.LoadUser(); } ...

Page 31: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٦٦

ي كه توضيح داده شد، دو صفحه Fromsاكنون در ادامه، جهت تكميل همان روش اعتبار سنجي مبتني بر TestFormsAuth.xaml ) يكUser control جديد ( وChildLoginWindow.xaml ) يكChild window

.خود اضافه كنيد Silverlightي را به برنامه) جديد TextBoxاين صفحه شامل دو . اند در ادامه ذكر شده ChildLoginWindow.xamlي صفحه XAMLكدهاي

ي عبور كاربر است؛ به همراه يك برچسب جهت نمايش خطاهاي رخ داده و دو جهت دريافت نام كاربري و كلمه :ي جاري و لغو عمليات و يا بستن صفحه Loginدكمه براي انجام عمليات

ChildLoginWindow.xaml

<controls:ChildWindow x:Class="SilverlightApplication101.ChildLoginWindow" xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls= "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Width="400" Height="180" Title="Login"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Margin="5" Grid.Column="0" Text="User Name: "> </TextBlock> <TextBox x:Name="UserName" Grid.Row="0" Margin="5" HorizontalAlignment="Left" Grid.Column="1" Width="150"> </TextBox> <TextBlock Grid.Row="1" Margin="5" Grid.Column="0" Text="Password: "> </TextBlock> <PasswordBox x:Name="Password" HorizontalAlignment="Left" Grid.Row="1" Margin="5" Grid.Column="1" Width="150">

Page 32: silverlight SL04-Ch26

Silverlight 4 ٥٦٧ </PasswordBox>

<TextBlock x:Name="LoginResult" TextWrapping="Wrap" Grid.Row="2" Grid.ColumnSpan="2" Foreground="Red"> </TextBlock> <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="3" Grid.Column="1" /> <Button x:Name="OKButton" Content="Login" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="3" Grid.Column="1"/> </Grid> </controls:ChildWindow>

:كدهاي متناظر با اين صفحه را در ادامه مالحظه خواهيد نمودChildLoginWindow.xaml.cs

using System.ServiceModel.DomainServices.Client.ApplicationServices; using System.Windows; namespace SilverlightApplication101 { public partial class ChildLoginWindow { public ChildLoginWindow() { InitializeComponent(); } private void OKButton_Click(object sender, RoutedEventArgs e) { var lp = new LoginParameters( UserName.Text, Password.Password); WebContext.Current.Authentication.Login( lp, this.loginOperationCompleted, null); LoginResult.Text = ""; OKButton.IsEnabled = false; } private void loginOperationCompleted(LoginOperation lo) { if (lo.HasError) { LoginResult.Text = lo.Error.Message;

Page 33: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٦٨

lo.MarkErrorAsHandled(); OKButton.IsEnabled = true; } else if (!lo.LoginSuccess) { LoginResult.Text = "Login failed. Please check user name and password."; OKButton.IsEnabled = true; } else if (lo.LoginSuccess) { //refresh user state //WebContext.Current.Authentication.LoadUser(); this.DialogResult = true; this.Close(); } } private void CancelButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; } } }

:توضيحاتبراي اين منظور . در سمت مشتري شروع خواهد شدLogin ، عمليات OKButton_Clickدر روال رخدادگردان

آرگومان اول آن بايد شامل . شود كمك گرفته مي WebContext.Current.Authentication.Loginاز متد ي اين آرگومان دوم آن جهت دريافت نتيجه. ي عبور كاربر باشد ايي حاوي نام كاربري و كلمه اطالعات شيء

.باشد كرديم مي مرور Silverlightهايي كه در فصل امنيت در عمليات غيرهمزمان همانند روشاگر . شود دريافت و پردازش مي Loginوضعيت عمليات loginOperationCompletedسپس توسط متد

را nullيا falseكه پيشتر در مورد آن توضيح داده شد، مقدار ValidateUserخطايي رخ داده باشد يا اگر متد مقدار دهي Trueرا به DialogResultدر غير اينصورت . برگرداند، پيغام خطايي به كاربر نمايش خواهيم داد

.ه و صفحه را خواهيم بستكردآن در ادامه ذكر XAMLاستفاده نمائيم كه كدهاي TestFormsAuth.xamlخواهيم در از اين صفحه مي

:اند شدهTestFormsAuth.xaml

<UserControl x:Class="SilverlightApplication101.TestFormsAuth" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

Page 34: silverlight SL04-Ch26

Silverlight 4 ٥٦٩ xmlns:mc=

"http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <StackPanel> <StackPanel Orientation="Horizontal"> <Button Name="btnLogin" Margin="5" HorizontalAlignment="Left" Content="Login" Width="100" Click="btnLogin_Click" /> <Button Name="btnLogout" Margin="5" HorizontalAlignment="Left" Content="Logout" Width="100" Click="btnLogout_Click" /> </StackPanel> <StackPanel Orientation="Horizontal" Name="userInfoPanel" Visibility="Collapsed"> <TextBlock Text="UserName:" Margin="5" /> <TextBlock Margin="5" Name="txtUserName"/> </StackPanel> </StackPanel> </UserControl>

. اند و يا بررسي عمليات خروج كاربر درنظر گرفته شده Loginي در اينجا دو دكمه براي نشان دادن صفحه اين صفحه در ذيل #Cكدهاي . نمايش دهيم Loginخواهيم نام كاربر را پس از عمليات موفقيت آميز هچنين مي :اند آورده شده

TestFormsAuth.xaml.cs

using System; using System.ServiceModel.DomainServices.Client.ApplicationServices; using System.Windows; namespace SilverlightApplication101 { public partial class TestFormsAuth { public TestFormsAuth() { InitializeComponent(); this.Loaded += TestFormsAuth_Loaded; } void TestFormsAuth_Loaded(object sender, RoutedEventArgs e) { if(!WebContext.Current.User.IsAuthenticated) { btnLogin_Click(this, null); } }

Page 35: silverlight SL04-Ch26

Silverlight در WCF RIA Services استفاده از – ٢٦ فصل

٥٧٠

private void btnLogin_Click(object sender, RoutedEventArgs e) { var loginForm = new ChildLoginWindow(); loginForm.Closed += loginForm_Closed; loginForm.Show(); } private void loginForm_Closed(object sender, EventArgs e) { txtUserName.Text = string.Empty; var dialog = sender as ChildLoginWindow; if (dialog == null) return; if (dialog.DialogResult == true) //if OK ... { txtUserName.Text = WebContext.Current.User.Name; userInfoPanel.Visibility = Visibility.Visible; if (WebContext.Current.User.IsInRole("Managers")) { //do something ... } } else { userInfoPanel.Visibility = Visibility.Collapsed; } } private void btnLogout_Click(object sender, RoutedEventArgs e) { WebContext.Current.Authentication.Logout( this.LogoutOperation_Completed, null); } private void LogoutOperation_Completed(LogoutOperation lo) { if (!lo.HasError) { userInfoPanel.Visibility = Visibility.Collapsed; } else { //Logout failed. lo.MarkErrorAsHandled(); }

Page 36: silverlight SL04-Ch26

Silverlight 4 ٥٧١ }

} }

:توضيحات بررسي خواهيم نمود كه آيا كاربر جاري اعتبار سنجي شده TestFormsAuth_Loadedدر روال آغازين

پس از . را به صورت خودكار به او نمايش خواهيم داد Loginي ؟ اگر خير، صفحه)IsAuthenticated(است هاي نمايش اطالعات كاربر را ي برچسب ي آن مثبت باشد، ابتدا قسمت دربرگيرنده ، اگر نتيجهLoginپايان عمليات

. ، نام او را نمايش خواهيم داد WebContext.Current.User.Nameنمايان كرده و سپس با كمك خاصيت هاي انتساب داده توان بر اساس نقش نيز مي WebContext.Current.User.IsInRoleاستفاده از متد همچنين با

. هاي بيشتري از صفحه را براي او نمايان كرد شده به كاربر جاري، قسمتشوند انتساب داده مي Userبه شيء NorthwindAuthenticationDomainService.csها در فايل اين نقش ).GetAuthenticatedUserمتد (

در . نيز بيان شده است WebContext.Current.Authentication.Logoutدر ادامه روش خروج يك كاربر به كمك متد هاي مختلف صفحه را كه نياز به اعتبار سنجي دارند از ديد او توان قسمت صورت موفقيت آميز بودن عمليات مي

.مخفي كردتوان صريحا مشخص ساخت كه نيز مي NorthwindDomainService.csنامه ، در فايل براي امنيت بيشتر بر

كداميك از متدها عمومي بوده و بدون نياز به اعتبار سنجي قابل دسترسي هستند و اطالعات كداميك تنها در را با ويژگي InsertProductبراي مثال اگر در اين كالس متد . گيرد اختيار كاربران اعتبار سنجي شده قرار مي

RequiresAuthentication مزين كنيم، ديگر كاربران اعتبار سنجي نشده دسترسي به آن نخواهند داشت: NorthwindDomainService.cs

... [RequiresAuthentication] public void InsertProduct(Product product) ...

:توان عالوه بر اين مورد، نقش خاصي را نيز صريحا ذكر نمود حتي مي NorthwindDomainService.cs

... [RequiresAuthentication] [RequiresRole("Managers")] public void DeleteProduct(Product product) ...

باشند، مجاز به حذف يك محصول Managersاي كه داراي نقش جي شدهدر اين مثال تنها كاربران اعتبار سن .خواهند بود