نحوه استفاده صحیح از لوسین در ASP.NET
استفاده از Flashback Table در Oracle
کتابخانه At.js
- Support IE 7+ for textarea.
- Supports HTML5 contentEditable elements (NOT including IE 8)
- Can listen to any character and not just '@'. Can set up multiple listeners for different characters with different behavior and data
- Listener events can be bound to multiple inputors.
- Format returned data using templates
- Keyboard controls in addition to mouse
-
Tab
orEnter
keys select the value -
Up
andDown
navigate between values (andCtrl-P
andCtrl-N
also) -
Right
andleft
will re-search the keyword.
-
- Custom data handlers and template renderers using a group of configurable callbacks
- Supports AMD
ابتدا دو کنترلر به صورت زیر ایجاد میکنیم:
var app = angular.module('myApp', []); app.controller('parentController', function () { this.title = 'Title from parent controller'; }) app.controller('childController', function () { this.title = 'Title from child controller'; })
<div ng-app="myApp"> <div ng-controller="parentController as parentCtrl"> <div ng-controller="childController as childCtrl"> <input type="text" ng-model="parentCtrl.title" size="100"/> <input type="text" ng-model="childCtrl.title" size="100"/> </div> </div> </div>
هر دو کنترلر دارای یک title مجزا هستند ولی با استفاده از یک اشاره گر توانستیم این دو title را تفکیک نماییم.
حال برای دسترسی به title کنترلر parent در سایر کنترلرها کافیست از نام مستعار parentCtrl استفاده نماییم. از آن جا که محدوده کنترلر child در داخل محدوده کنترلر parent است دسترسی به کنترلر parent امکان پذیر میباشد.
<div ng-app="myApp"> <div ng-controller="parentController as parentCtrl"> <div ng-controller="childController as childCtrl"> <input type="text" ng-model="parentCtrl.title" size="100"/> <input type="text" ng-model="parentCtrl.title" size="100"/> </div> </div> </div>
نکته: دسترسی به کنترلر child در کنترلر parent امکان پذیر نیست.
کار با توابع prevmember و nextmember
قبل از اجرای کوئریهای زیر در ابتدا به ساختار سلسله مراتبی Customer دقت نمایید و ترتیب کشورها را در این ساختار بررسی نمایید.
کوئری زیر را اجرا نمایید :
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] }on columns, { [Customer].[Customer Geography].[Country].[Germany], [Customer].[Customer Geography].[Country].[Germany].prevmember }on rows From [Adventure Works]
این تابع برادر قبلی را بدست میآ ورد
حال کوئری زیر را اجرا نمایید :
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, { [Customer].[Customer Geography].[Country].[Germany], [Customer].[Customer Geography].[Country].[Germany].lag(1) } on rows From [Adventure Works]
در اینجا میزان فروش اینترنتی و همچنین میزان مالیات اینترنتی برای مشتریان آلمان و کشور قبلی بدست میآید.
با این تابع می توان برادر قبلی را با اعلام یک فاصله بدست آورد. مثلا 4 برادر قبلی یا .... را توسط این تابع بدست آورد .
کوئری زیر را اجرا نمایید :
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, { [Customer].[Customer Geography].[Country].[Germany], [Customer].[Customer Geography].[Country].[Germany].prevmember.prevmember } on rows From [Adventure Works]
در این حالت مشابه تابع (2)Lag عمل کرده ایم. حال با استفاده از تابع Nextmember می توانیم برادر بعدی را بدست بیاوریم.
کوئری زیر را اجرا کنید :
select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, { [Customer].[Customer Geography].[Country].[Germany], [Customer].[Customer Geography].[Country].[Germany].nextmember } on rows From [Adventure Works]
و همچنین در کوئری زیر برادر بعد از برادر بعدی را بدست آورده ایم
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, { [Customer].[Customer Geography].[Country].[Germany], [Customer].[Customer Geography].[Country].[Germany].nextmember.nextmember } on rows From [Adventure Works]
یک ترکیب از عملگر Range , NextMember در کوئری زیر نوشته شده است.
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, [Customer].[Customer Geography].[Country].[Germany] : [Customer].[Customer Geography].[Country].[Germany].nextmember.nextmember on rows From [Adventure Works]
کاربرد تابع Lead برای به دست آوردن برادر بعدی بر اساس عددی می باشد که به آن داده ایم .
در اینجا ترکیبی از رنج و به دست آوردن برادر برادر بعدی را داریم .
Select { [Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount] } on columns, [Customer].[Customer Geography].[Country].[Germany] : [Customer].[Customer Geography].[Country].[Germany].lead(2) on rows From [Adventure Works]
در قسمت بعدی تابع Order را بررسی میکنیم.
این مرورگرها در صورتیکه پیاده سازی پروتکل Open Search را در سایت شما پیدا کنند، به صورت خودکار امکان افزودن آنرا به عنوان منبع جستجوی جدیدی جهت جعبه متنی جستجوی خود ارائه میدهند. در ادامه قصد داریم با جزئیات پیاده سازی آن آشنا شویم.
تهیه OpenSearchResult سفارشی
برنامه باید بتواند محتوای XML ایی ذیل را مطابق پروتکل Open Search به صورت پویا تهیه و در اختیار مرورگر قرار دهد:
<?xml version="1.0" encoding="UTF-8" ? /> <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> <ShortName>My Site's Asset Finder</ShortName> <Description>Find all your assets</Description> <Url type="text/html" method="get" template="http://MySite.com/Home/Search/?q=searchTerms"/> <InputEncoding>UTF-8</InputEncoding> <SearchForm>http://MySite.com/</SearchForm> </OpenSearchDescription>
using System; using System.Text; using System.Web; using System.Web.Mvc; using System.Xml; namespace WebToolkit { public class OpenSearchResult : ActionResult { public string ShortName { set; get; } public string Description { set; get; } public string SearchForm { set; get; } public string FavIconUrl { set; get; } public string SearchUrlTemplate { set; get; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; writeToResponse(response); } private void writeToResponse(HttpResponseBase response) { response.ContentEncoding = Encoding.UTF8; response.ContentType = "application/opensearchdescription+xml"; using (var xmlWriter = XmlWriter.Create(response.Output, new XmlWriterSettings { Indent = true })) { xmlWriter.WriteStartElement("OpenSearchDescription", "http://a9.com/-/spec/opensearch/1.1/"); xmlWriter.WriteElementString("ShortName", ShortName); xmlWriter.WriteElementString("Description", Description); xmlWriter.WriteElementString("InputEncoding", "UTF-8"); xmlWriter.WriteElementString("SearchForm", SearchForm); xmlWriter.WriteStartElement("Url"); xmlWriter.WriteAttributeString("type", "text/html"); xmlWriter.WriteAttributeString("template", SearchUrlTemplate); xmlWriter.WriteEndElement(); xmlWriter.WriteStartElement("Image"); xmlWriter.WriteAttributeString("width", "16"); xmlWriter.WriteAttributeString("height", "16"); xmlWriter.WriteString(FavIconUrl); xmlWriter.WriteEndElement(); xmlWriter.WriteEndElement(); xmlWriter.Close(); } } } }
تهیه OpenSearchController
در ادامه برای استفاده از Action Result سفارشی تهیه شده، نیاز است یک کنترلر را نیز به برنامه اضافه کنیم:
using System.Web.Mvc; namespace Readers { public partial class OpenSearchController : Controller { public virtual ActionResult Index() { var fullBaseUrl = Url.Action(result: MVC.Home.Index(), protocol: "http"); return new OpenSearchResult { ShortName = ".NET Tips", Description = ".NET Tips Contents Search", SearchForm = fullBaseUrl, FavIconUrl = fullBaseUrl + "favicon.ico", SearchUrlTemplate = Url.Action(result: MVC.Search.Index(), protocol: "http") + "?term={searchTerms}" }; } } }
الف) آدرسهای مطرح شده در آن باید مطلق باشند و نه نسبی. به همین جهت پارامتر protocol در اینجا ذکر شده است تا سبب تولید یک چنین آدرسهایی گردد.
ب) Url.Action ایی که در اینجا استفاده شده است مطابق تعاریف T4MVC است؛ ولی کلیات آن با نمونه پیش فرض ASP.NET MVC تفاوتی نمیکند. توسط T4MVC بجای ذکر نام اکشن متد و کنترلر مد نظر به صورت رشتهای، میتوان به صورت Strongly typed به این موارد ارجاع داد.
ج) تنها نکته مهم این کلاس، خاصیت SearchUrlTemplate است. قسمت انتهایی آن یعنی ={searchTerms} همیشه ثابت است. اما ابتدای این آدرس باید به کنترلر جستجوی شما که قادر است پارامتری را به شکل کوئری استرینگ دریافت کند، اشاره نماید.
د) FavIconUrl به آدرس یک آیکن در سایت شما اشاره میکند. برای نمونه ذکر favicon.ico پیش فرض سایت میتواند مفید باشد.
معرفی OpenSearchController به Header سایت
<link href="@Url.Action(result: MVC.OpenSearch.Index(), protocol: "http")" rel="search" title=".NET Tips Search" type="application/opensearchdescription+xml" />