[FCKEditor]Integrating FCKeditor in ASP.Net

mikel阅读(966)

Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article

Introduction

In Basic ASP.NET, FCKeditor can be easily integrated. Here is the link where I found that.

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Integration/ASP.NET

However, to integrate FCKeditor in ASP.NET MVC environment, we have to follow some tricky steps. Here I will show how to integrate using core JavaScript as well as using JQuery.

Using JavaScript

Step 1

Download the FCKeditor from http://www.fckeditor.net/download.

Step 2

Unzip the package and put in your project content directory. I liked to make a directory "JavaScript" under "Content" directory and put "unzipped fckeditor" here. I have also put fckeditorapi.js in "Javascript" folder. You can get more information on FCKeditor API here

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/JavaScript_API

Step 3

I have added a MVC view file in Home folder and named it as "Fck.aspx". To view this file, I included a method in HomeController, as follows.

/// <summary>
/// Show FCK Editor View Page
/// </summary>
public void Show()
{
RenderView("Fck");
}  

Step 4

In Fck.aspx, include the fckeditor.js and fckeditorapi.js file:

<script type="text/javascript" src="../../Content/Javascript/fckeditor/fckeditor.js"></script>
<script type="text/javascript" src="../../Content/Javascript/fckeditorapi.js"></script>

Include the following to replace textarea (named 'content') by FCKeditor. Here I have included InsertContent(), ShowContent() and ClearContent() methods to perform some extra actions.

<script type="text/javascript">
window.onload = function()
{
var oFCKeditor = new FCKeditor( 'content' ) ;
oFCKeditor.BasePath = "/Content/Javascript/fckeditor/" ;
oFCKeditor.Height = 300;
oFCKeditor.ReplaceTextarea() ;
}
function InsertContent()
{
var oEditor = FCKeditorAPI.GetInstance('content') ;
var sample = document.getElementById("sample").value;
oEditor.InsertHtml(sample);
}
function ShowContent()
{
var oEditor = FCKeditorAPI.GetInstance('content') ;
alert(oEditor.GetHTML());
}
function ClearContent()
{
var oEditor = FCKeditorAPI.GetInstance('content');
oEditor.SetHTML("");
}
</script>

Here is the html content:

<div>
<input id="sample" type="text" />
<input id="cmdInsert" type="button" value="Insert Content" onclick="InsertContent()" />
<input id="cmdClear" type="button" value="Clear Content" onclick="ClearContent()" />
<br /> <br />
<textarea id="content" cols="30" rows="10"></textarea>
<br />
<input id="cmdShow" type="button" value="Show Content" onclick="ShowContent()" />
</div> 

Step 5

Now build the application and run. Click the "FCK Editor" link and get the result.

Using JQuery

Step 1

Download JQuery from http://www.jquery.com. I have put jQuery-1.2.6.pack.js and jQuery.FCKEditor.js in my "Javascript" folder".

Step 2

I have added a MVC view file in Home folder and named it as "FckjQuery.aspx". To view this file, I included a method in HomeController, as follows.

/// <summary>
/// Show FCK Editor By JQuery
/// </summary>
public void View()
{
RenderView("FckJquery");
}

Step 3

In FckJquery.aspx, include the jquery-1.2.6.pack.js, fckeditor.js and jquery.FCKEditor.js file:

<script type="text/javascript" src="../../Content/Javascript/jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="../../Content/Javascript/fckeditor/fckeditor.js"></script>
<script type="text/javascript" src="../../Content/Javascript/jquery.FCKEditor.js"></script>

Include the following to replace textarea (named 'content') by FCKeditor. Here I have included InsertContent(), ShowContent() and ClearContent() methods to perform some extra actions.

<script type="text/javascript">
$(document).ready(function(){
$.fck.config = {path: '/Content/Javascript/fckeditor/', height: 300 };
$('textarea#content').fck();
});
function InsertContent()
{
var sample = document.getElementById("sample").value;
$.fck.insertHtml('fck1', sample);
}
function ShowContent()
{
alert($.fck.content('fck1', ''));
}
function ClearContent()
{
$.fck.clearHtml('fck1');
}
</script>

Here is the html content:

<div>
<input id="sample" type="text" />
<input id="cmdInsert" type="button" value="Insert Content" onclick="InsertContent()" />
<input id="cmdClear" type="button" value="Clear Content" onclick="ClearContent()" />
<br /> <br />
<textarea id="content" cols="30" rows="10"></textarea>
<br />
<input id="cmdShow" type="button" value="Show Content" onclick="ShowContent()" />
</div>

Step 4

In jquery.FCKEditor.js file, I have included two functions. Function insertHtml() inserts html content into fckeditor and clearHtml() clears the content.

// insert Html Content
insertHtml: function(i, v) {
try{
var x = FCKeditorAPI.GetInstance(i);
if(v) x.InsertHtml(v);
else return '';
}
catch(e) { return ''; };
},
// clear Html Content
clearHtml: function(i) {
try{
var x = FCKeditorAPI.GetInstance(i);
x.SetHTML('');
}
catch(e) { return ''; };
},

Step 5

Now build the application and run. Click the "FCK Editor By JQuery" link and get the result. Enjoy It!

References

http://docs.fckeditor.net

http://www.jquery.com

http://www.fyneworks.com/jquery/FCKEditor

Conclusion

Next I will try to give some demonstration on how to build plugins in FCKeditor. Till then bye.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Mohammad Jahedur Rahman

I am a .Net Developer working now in a leading software company Brain Station-23 Bangladesh.

Occupation: Web Developer
Company: Brain Station-23
Location: Bangladesh Bangladesh

[CSS]面向对象的CSS

mikel阅读(667)

时下流行面向对象,那么有没有可能把样式表也面向对象一下呢,将现在的CSS(Cascading Style Sheets层叠样式表)进

化一下,演变成面向对象的样式表给套了个概念上去,以下叫“OOCSS”,即 Object oriented Cascading Style Sheets。

 

 ◆ 为什么会这样想?

      没办法,被逼的, 俺们公司的美工只做图片,其它的是啥都不管,近来弄个WEB项目,都做差不多了,老总说要能换肤。呵呵

还好之前有所考虑,三两天就搞定了。

      我的方法是,页面全部用CSS控制,主要有 common.css、list.css、addedit.css等10来个css文件和图片,全部放一个叫

Common/Skins的目录下 ,Common/Skins下每套皮肤一个文件夹,最终目录结构大致如下。

Code

 

      共定义有5、6套皮肤,CSS和图片文件急剧上涨,由原来的10来个一下子上升到了7,8十个,虽然数量是有点吓人,不过每套

皮肤,CSS和图片都大部分差不多,也没花多少功夫就搞定了,不管了,甩一边。

      几天后的某一天早晨,好大的台风,呼呼的,雨也不小,让人觉得很不爽,就像出事前的预兆 !

      果然,没坐下多久,老总过来说“和美工讨论了下,有几个地方,布局要变下……”。

      一阵的嘻哩哗啦之后,我心里除了佩服老总口才不错之外,觉得自己命好苦呀!

      那么多CSS,得改多久呀,以后要再变的话不还得改吗!

      仔细分析下CSS,其实每套皮肤都大体差不多,不同的地方一般都是边框、文字的颜色和背景色,还有图片、字号,于是我决定

所有的皮肤都用同一套公共的CSS文件,另外,每套皮肤再加一个独立CSS文件(Settings.css),而该CSS中只定义基本的样式,

相当于配置文件一样的,然后作用于其余几个公共的CSS文件。

      我坚信这样的思路是对的,可是怎么实现呢?

      首先想到的,当然是用CSS的组合,将之前部分CSS规则分离,公共部分提取出来放在 Settings.css中定义,如:

      将List.css中规则 
               .ToolBar{color:#f0e000;border:1px solid gray;} 
          分离为
               .DefaultColor{color:#f0e000;}定义在Settings.css中
               .ToolBar{border:1px solid gray;}仍然保留在List.css中

          然后将HTML中对 .ToolBar 的引用“class='ToolBar'”改为“class='DefaultColor ToolBar '”

      再将其它color属性相同的CSS规则进行同样的分离。这样每套皮肤不同的地方就只是 settings.css文件里.DefaultColor类型

的规则。

      而这样做又引发的新的问题,必须得每个页面改HTML中的class属性,而背景图片只能依靠 expression 来解决,expression

又常常造成页面的死锁,无奈之下只有另谋出路。

      

 ◆ 面向对象的CSS: OOCSS 基本构思

      继承:

            OOCSS中,类(样式规则)可以继承自另一类,如

例一

            .Base{font-size:20pt;}
            .Sun{color:red;}

            假如用如下语法可以实现继承

            .Base{font-size:20pt;}
            .Sun (inherit .Base)
            {
                    color:red;
            }

 

            而现在类 .Sun 则不单单拥有 “color:red;”属性,应该拥有从基类 .Base 中继承的 “font-size:20pt”属性 ,

     cssText应该是 “font-size:20pt;color:red”。

      覆盖:

           将上例中的 .Sun 更改如下:

            .Base{font-size:20pt;}
            .Sun (inherit .Base)
            {
                    font-size:10pt;
                    color:red;
            }

            则实现了对基类“font-size:20pt”的覆盖,.Sun中的font-size则为10pt。

 

     子类访问基类

例二

            .Base
            {
                    v:20;
                    font-size:20pt;
            }

            .Sun (inherit .Base)
            {
                    padding : (base.v+10)px;
                    font-size:(base.fontSize/2)pt;
                    color:red;
            }

            .Sun2 (inherit .Base)
            {
                    padding : (base.v+20)px;

            }

 

           在基类 .Base 中定义了变量 “v:20”和style属性“font-size:20pt”,子类 .Sun和.Sun2中style属性padding和

     font-size通过访问基类变量和属性计算而来,而最终 .Sun 中 padding等于30px,.Sun2中padding等于40px;.Sun中

     fong-size等于10pt,.Sun2没有覆盖基类中的font-size,所以font-size继承基类,值仍为20pt。

 

     多继承

例三

            .Base{font-size:20pt;}

            .Base2{color:red;}

            .Sun (inherit .Base,.Base2)
            {
                    padding:20px;
            }

            .Grandson (inherit .Base)
            {

            }

 

          类.Sun继承自两个基类.Base和.Base2,所以.Sun的cssText为“font-size:20pt;color:red;padding:20px;”,而

     .Grandson继承自.Sun,本身没有任何自定义属性,因此cssText和.Sun一样,仍为“font-size:20pt;color:red;

     padding:20px;”。

      

     私有(假如用private作为关键字)

例四

            .Base
             {
                    font-size:20pt;
                    private color:red;
             }

            .Sun (inherit .Base)
            {
                    padding:10px;
            }

 

          子类 .Sun 继承基类 .Base 中的fontSize属性,因为 .Base中color属性受private(私有)限制,不能被.Sun继承,最终

     .Sun的cssText是“font-size:20pt;padding:10px”。

 

     更多特性待琢磨……

 

 

  ◆ 这样做有意义吗?

       我的回答是“有”     !

       1.  CSS的优点之一“一处定义,多处使用”

               目前的CSS多处使用指的是,一个CSS规则可以由多个HTML元素引用。可CSS规则间不能互操作。

       2.  CSS的继承

               CSS的继承不是真正意义上的继承,而是HTML元素对外层元素Style属性的继承,且部分Style属性、HTML元素是不能

          继承的,如backgroundColor属性、border属性、padding属性、table元素等等(当然,部分不支持继承也是合理的)。

      3.  CSS优先级

               当多个CSS规则作用于同一个HTML元素时,CSS将根据CSS规则权重 、规则定义的先后配合HTML元素的层次关系决

          定最终的有效值,这样的解决方案有时很巧妙,可当HTML层次结构过深、而作用于同一个HTML元素的CSS规则过多时,

          CSS规则的优先级控制是相当的不容易,有时候不得不用蹩脚的“! important”来解决问题,可“! important”不符合标

          准,支持的浏览器很少。

      OOCSS在保留CSS特性(或者说是优点)的前提下,将从某种程度上解决以上问题

     1.  OOCSS中,类可以访问基类甚至没有依赖关系的其他类,应用灵活……。

     2.  OOCSS中,继承是类对基类属性的继承,不同于CSS中的继承(HTML元素对上层元素Style属性的继承),子类直接继承

          基类不受private(私有)关键字修饰的属性。

     3.  OOCSS实现继承后,就会在一定程度上避免CSS组合的应用,便会减少意外的HTML元素匹配,同时HTML元素在class属

          性中应用子类时,权重跟基类无关,和子类一致,如例三中,子类 .Sun 的权重跟基类 .Base1、.Base2无关 。

 

 

 ◆ 我认为OOCSS很有趣,也有用,那么该怎么做呢?

           上面的想法都是建立在假如的基础上的,都只是我一种猜想而已

            .Base
             {
                    font-size:20pt;
                    private color:red;
             }

            .Sun (inherit .Base)
            {
                    padding:10px;
            }

            这样的代码各位都不认识,浏览器又怎么会认识呢,那么是不是就不能实现呢?不是的,我们可以通过一些其他方法模拟,

       虽然有些尴尬!

            我的做法是,写个JS解析,基本实现以上想法,代码太多,不方便贴出来,供下截

                 下载:http://www.66s.com.cn/oocss/OOCSSDemo.rar
                         http://files.cnblogs.com/kuiyouli/OOCSSDemo.rar

                 演示:http://www.66s.com.cn/oocss/

                 有兴趣的朋友可进入QQ群:15774494

                 注:目前只支持IE浏览器

       实现功能如下:

       1.  继承 

                因为浏览器不支持 .Sun (inherit .Base) 这样的语法,所以改为如下形式:

                    .DefaultColor{color:red;}
                    .Sun
                    {
                         base: .DefaultColor;
                         font-size:9pt;
                    }
                用 “base”关键字指定基类,注意是“.DefaultColor”,而不是“DefaultColor”,基类必须是类全称,可以指定多个基

          类,如:

                    .BaseHeight{height:30px;}
                    .DefaultColor{color:red;}
                    .Sun
                    {
                         base: .DefaultColor,.BaseHeight;
                         font-size:9pt;
                    }          

 

       2.  附加

                跟继承类似,实现的却是CSS的组合功能。

                    .BaseHeight{height:30px;}
                    .DefaultColor{color:red;}
                    .Sun
                    {
                         append: .DefaultColor,.BaseHeight;
                         font-size:9pt;
                    } 

               当HTML元素引用类 .Sun 时,OOCSS会自动将 .DefaultColor、.BaseHeight附加到HTML元素的class属性,如:

                    <div class=".Sun"></div>

               则该div最后的class属性值为“.Sun .DefaultColor .BaseHeight”。因此,.DefaultColor、.BaseHeight中的属性受

          其优先级的影响,跟.Sun的优先级无关。

      3.   eval表达式

               eval表达式类似expression表达式,不同之处在于,eval只在初始化时执行一次。

                     .TestEval
                    {
                         E-height: eval(20+30);
                    }

               相当于:

                     .TestEval
                    {
                         height: 50px;
                    }

 

               可以在eval中访问脚本变量,如:

                    <script>
                         var skin={color:'red', defaultSize:'9pt'}
                    </script>

                    <style>
                         .TestEval
                         {
                              E-color: eval(skin.color);
                              E-font-size: eval(skin.defaultSize);
                         } 

                         .LargeFont
                         {
                              e-font-size:eval(     (parseInt(skin.defaultSize)+3)+"pt"     )
                         }
                    </style>

               以上代码相当于:

                    <style>
                         .TestEval
                         {
                              color: red;
                              font-size: 9pt;
                         }
 

                         .LargeFont
                         {
                              font-size:12pt;
                         }
                    </style>                    

     4.  .Global或.Init初始化

          可以类名为 .Global或 .Init的类配合eval关键字初始化。

                   <style>

                         .Global
                         {
                              E-init: eval(     window.skin={color:'red', defaultSize:'9pt'}     );
                         }

                         .TestEval
                         {
                              E-color: eval(skin.color);
                              E-font-size: eval(skin.defaultSize);
                         }
                    </style>

               以上代码相当于:

                    <style>
                         .TestEval
                         {
                              color: red;
                              font-size: 9pt;
                         }
                    </style> 

 

 

     5.  访问基类

          通过eval关键字和base关键字,访问基类对象。

                    .DefaultHeight{height:30px;}
                    .Sun
                    {
                         base: .DefaultHeight;
                         E-height: eval(parseInt(base.height)+20);
                    }

           相当于:

                    .Sun
                    {
                         height: 50px;
                    }

           当有多个基类时,则可以这样访问:

                    .DefaultColor{color:red;}                    
                    .DefaultHeight{height:30px;}
                    .Sun
                    {
                         base: .DefaultColor ,.DefaultHeight;
                         E-height: eval(parseInt(base[1].height)+20);
                    }

           也可以这样访问

                    .DefaultColor{color:red;}                    
                    .DefaultHeight{height:30px;}
                    .Sun
                    {
                         base: .DefaultColor ,.DefaultHeight;
                         E-height: eval(parseInt(base[DefaultHeight].height)+20);
                    }

           相当于:

                    .Sun
                    {
                         color: red;
                         height: 50px;
                    }

  

     6.  私有成员

          下一版本实现……

[JQuery]JQuery取得IFrame中的值

mikel阅读(802)

1.在父窗口中操作 選中IFRAME中的所有單選鈕
$(window.frames["iframe1"].document).find("input[@type=&#39;radio&#39;]").attr("checked","true");
2.在IFRAME中操作 選中父窗口中的所有單選鈕
$(window.parent.document).find("input[@type=&#39;radio&#39;]").attr("checked","true");
iframe框架的:<iframe src="test.html" id="iframe1" width="700" height="300" frameborder="0" scrolling="auto"></iframe>
$(&#39;#parentElem&#39;, top.document).append(&#39;</code><div class="imgbox" id="imgbox"><img class="img" src="http://www.blogger.com/pp.png" id="img" /></div>&#39;);
alert($(document.getElementById(&#39;ifr&#39;).contentWindow.document.body).html());

[FCKEditor]FCKeditor远程图片自动上传插件

mikel阅读(979)

有时候我们从其他网页上拷贝来的内容中含有图片,当原始地址失效后就会影响读者阅读。
所以我制作了这样一个插件,可以将远程图片保存到本地服务器。
声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!
////////////////////////////////////////////////////
作者:武眉博<活靶子.NET>
同时首发于:
    落伍者   && 博客园  
    开发者学院   && .Net男孩社区
////////////////////////////////////////////////////
今天转载了xiaozhuang朋友的文章同时从博客园服务器上下载了图片
演示见:http://www.devedu.com/Doc/DotNet/AspNet/AspNet-AjaxWCF-ServiceADONET-Entity-FrameworkShiXianShuJuLieBiaoShuJuShaiXuanFenYePaiXuShanChu.aspx


原理如下:
    1.实现ICallbackEventHandler接口以用启用客户端回调。
    2.从当前FckEdiotr内容分析出所有<img标签,取得src的地址。
    3.回调下载到服务器。
    4.返回下载后位于本服务器上的路径。
    5.替换当前FckEdiotr内容内对应的<img标签的src属性。
其他废话不多说了,代码中都有注释。
如果您熟悉Fckeditor的插件工作流程,请继续向下阅读,另请不要留言要我直接提供下载,下面的代码已经可以完整调试了。
E:\IISROOT\FckTest\FckTest\fckeditor\editor\plugins\remoteimagerubber\remoteimagerubber.aspx

  1 <%
  2 使用单页模型(非代码后置),是为了便于此插件部署,
  3 不需编译成dll,只需拷贝remoteimagerubber.aspx 和 fckplugin.js 到plugn目录,
  4 并配置一下fckconfig.js及相应的语言包,就可以使用了。
  5 %>
  6 
  7 <%@ Page Language="C#" %>
  8 
  9 <%@ Import Namespace="System.Net" %>
 10 <%
 11 实现ICallbackEventHandler接口以提供客户端回调功能。
 12 %>
 13 <%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
 14 
 15 <script runat="server">
 16     
 17     /// <summary>
 18     /// 此处配置远程文件保存目录
 19     /// </summary>
 20     private static readonly string savePath = "~/Uploads/";
 21 
 22     /// <summary>
 23     /// 此处配置允许下载的文件扩展名
 24     /// <remarks>
 25     ///     暂未考虑使用动态网页输出的图片如:http://site/image.aspx?uid=00001 这样的URI;
 26     ///  若要实现此功能可读取流并判断ContentType,将流另存为相应文件格式即可。
 27     /// </remarks>
 28     /// </summary>
 29     private static readonly string[ ] allowImageExtension = new string[ ] { ".jpg" , ".png" , ".gif" };
 30 
 31     /// <summary>
 32     /// 此处配置本地(网站)主机名
 33     /// </summary>
 34     private static readonly string[ ] localhost = new string[ ] { "localhost" , "www.devedu.com" };
 35 
 36     private string localImageSrc = string.Empty;
 37 
 38     private void Page_Load( object obj , EventArgs args )
 39     {
 40         if ( !Page.IsPostBack )
 41         {
 42             ClientScriptManager csm = Page.ClientScript;
 43 
 44             string scripCallServerDownLoad = csm.GetCallbackEventReference( this , "args" , "__ReceiveServerData" , "context" );
 45             string callbackScriptDwonLoad = "function __CallServerDownLoad(args , context) {" + scripCallServerDownLoad + "; }";
 46             if ( !csm.IsClientScriptBlockRegistered( "__CallServerDownLoad" ) )
 47             {
 48                 csm.RegisterClientScriptBlock( this.GetType( ) , "__CallServerDownLoad" , callbackScriptDwonLoad , true );
 49             }
 50         }
 51     }
 52 
 53     #region ICallbackEventHandler 成员
 54 
 55     /// <summary>
 56     /// 返回数据
 57     /// </summary>
 58     /// <remarks>如果处理过程中出现错误,则仍然返回远程路径</remarks>
 59     /// <returns>服务器端处理后的本地图片路径</returns>
 60     public string GetCallbackResult( )
 61     {
 62         return localImageSrc;
 63 
 64     }
 65 
 66     /// <summary>
 67     /// 处理回调事件 
 68     /// </summary>
 69     /// <param name="eventArgument">一个字符串,表示要传递到事件处理程序的事件参数</param>
 70     public void RaiseCallbackEvent( string eventArgument )
 71     {
 72 
 73         string remoteImageSrc = eventArgument;
 74 
 75         string fileName = remoteImageSrc.Substring( remoteImageSrc.LastIndexOf( "/" ) + 1 );
 76         string ext = System.IO.Path.GetExtension( fileName );
 77 
 78         if ( !IsAllowedDownloadFile( ext ) )
 79         {
 80             //非指定类型图片不进行下载,直接返回原地址。
 81             localImageSrc = remoteImageSrc;
 82             return;
 83         }
 84 
 85         Uri uri = new Uri( remoteImageSrc );
 86         if ( IsLocalSource( uri ) )
 87         {
 88             //本地(本网站下)图片不进行下载,直接返回原地址。
 89             localImageSrc = remoteImageSrc;
 90             return;
 91         }
 92 
 93         try
 94         {
 95             //自动创建一个目录。
 96             DateTime now = DateTime.Now;
 97             string datePath = string.Format( @"{0}\{1}\{2}\{3}" , now.Year , now.Month.ToString( "00" ) , now.Day.ToString( "00" ) , Guid.NewGuid( ).ToString( ) );
 98 
 99             string localDirectory = System.IO.Path.Combine( Server.MapPath( savePath ) , datePath );
100             if ( !System.IO.Directory.Exists( localDirectory ) )
101             {
102                 System.IO.Directory.CreateDirectory( localDirectory );
103             }
104 
105             string localFilePath = System.IO.Path.Combine( localDirectory , fileName );
106 
107             //不存在同名文件则开始下载,若已经存在则不下载该文件,直接返回已有文件路径。
108             if ( !System.IO.File.Exists( localFilePath ) )
109             {
110                 Client.DownloadFile( uri , localFilePath );
111             }
112 
113             string localImageSrc = ResolveUrl( "~/" + localFilePath.Replace( Server.MapPath( "~/" ) , string.Empty ).Replace( "\\" , "/" ) );
114 
115         }
116         catch
117         {
118             //下载过程中出现任何异常都不抛出(  有点狠啊 🙂  ),仍然用远程图片链接。
119             localImageSrc = remoteImageSrc;
120         }
121 
122     }
123 
124 
125     #endregion
126 
127     private WebClient client;
128 
129     /// <summary>
130     /// <see cref="System.Net.WebClient"/>
131     /// </summary>
132     public WebClient Client
133     {
134         get
135         {
136             if ( client != null )
137             {
138                 return client;
139             }
140 
141             client = new WebClient( );
142             client.Headers.Add( "user-agent" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)" );
143 
144             return client;
145 
146         }
147     }
148 
149     /// <summary>
150     /// 判断Uri是否为本地路径
151     /// </summary>
152     /// <param name="uri"></param>
153     /// <returns></returns>
154     private bool IsLocalSource( Uri uri )
155     {
156         for ( int i = localhost.Length ; >= 0 ; )
157         {
158             if ( localhost[ i ].ToLower( ) == uri.Host.ToLower( ) )
159             {
160                 return true;
161             }
162         }
163 
164         return false;
165 
166     }
167 
168     /// <summary>
169     /// 检测文件类型是否为允许下载的文件类型
170     /// </summary>
171     /// <param name="extension">扩展名 eg: ".jpg"</param>
172     /// <returns></returns>
173     private bool IsAllowedDownloadFile( string extension )
174     {
175         for ( int i = allowImageExtension.Length ; >= 0 ; )
176         {
177             if ( allowImageExtension[ i ].ToLower( ) == extension.ToLower( ) )
178             {
179                 return true;
180             }
181         }
182 
183         return false;
184     }
185     
186 </script>
187 
188 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
189 <html xmlns="http://www.w3.org/1999/xhtml">
190 <head runat="server">
191     <title></title>
192     <style type="text/css">
193     body { margin: 0px; overflow: hidden;  background-color: buttonface;  }
194     td { font-size: 11pt; font-family: Arial;text-align: left;}
195     #domProgressBarId{
196         width: 0%;
197         height: 15px;  
198         border-right: buttonhighlight 1px solid;
199         border-top: buttonshadow 1px solid; 
200         border-left: buttonshadow 1px solid; 
201         border-bottom: buttonhighlight 1px solid;
202         background-color: highlight;
203     }
204 </style>
205 
206     <script type="text/JavaScript" language="JavaScript"> 
207         
208         var RemoteImageRubber = function ( remoteSrcList )
209         {
210             this._remoteSrcList = remoteSrcList;
211             this._totalFilesCount = remoteSrcList.length; 
212         }
213 
214         RemoteImageRubber.prototype.CurrentPercent = function()
215         {
216             return Math.round( 100 * (1  this.CurrentFilesCount() / this.TotalFilesCount() ) )+"%";
217         }
218         
219         RemoteImageRubber.prototype.TotalFilesCount = function()
220         {
221             return this._totalFilesCount;
222         }
223         
224         RemoteImageRubber.prototype.CurrentFilesCount = function()
225         {
226             return this._remoteSrcList.length;
227         }
228 
229         RemoteImageRubber.prototype.NextFile = function ()
230         {
231            
232             if(this._remoteSrcList.length >0)
233             {
234                 var currentRemoteSrc = this._remoteSrcList.shift( )
235                 __PreCallServer(currentRemoteSrc);
236             }        
237         }
238         
239     </script>
240 
241     <script type="text/javascript" language="javascript">
242         
243         var oEditor;
244         var domProgressBar;
245         var domCurrentFile;
246         var domAllFilesCount;
247         var domAlreadyDownloadFilesCount;
248         
249         var imageUrls;
250         var remoteList = new Array();
251         var localList = new Array(); 
252         
253         var progressBar;
254         
255         function Ok()
256         {
257             var __imgIndex;
258             for(__imgIndex = 0; __imgIndex < imageUrls.length; __imgIndex ++)
259             {
260                 imageUrls[__imgIndex].src = localList[__imgIndex];                    
261             }    
262             
263             return true ;
264         }
265         
266     </script>
267 
268     <script language="javascript" type="text/javascript">
269     
270         function __PreCallServer(currentRemoteSrc)
271         {
272             var start = currentRemoteSrc.lastIndexOf("/"+ 1;
273             var end = currentRemoteSrc.length  currentRemoteSrc.lastIndexOf("/");
274 
275             var currentFileName = currentRemoteSrc.substr(start,end);
276                         
277             domCurrentFile.innerHTML = currentFileName;         
278             __CallServerDownLoad(currentRemoteSrc,'');
279             
280         }
281         
282         function __ReceiveServerData(receiveValue ,context)
283         {
284             // 注意:——————————————————————————————-
285             //
286             // (1)不要在接收回调数据时使用变量 "i"。
287             // (2)如果再次回调请使用window.setTimeout(.这样的形式
288             //
289             //      否则会导致 "'__pendingCallbacks[].async' 为空或不是对象"的错误产生。
290             //  
291             //      因为MS的开发人员在WebForm_CallbackComplete函数内使用了全局变量"i" 。这是一个比较ugly的bug。
292             //
293             // 参见:
294             //   http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101974
295             //   http://developers.de/blogs/damir_dobric/archive/2006/03/02/4.aspx?Ajax_CallBack=true
296             //   http://developers.de/files/folders/279/download.aspx
297             //   http://blogs.SQLxml.org/bryantlikes/archive/2005/12/20/4593.aspx
298             //
299             //————————————————————————————————-
300 
301             if(receiveValue )
302             {
303                 var localSrc = receiveValue;
304                 localList.push(localSrc);
305                 
306                 domAlreadyDownloadFilesCount.innerHTML = progressBar.TotalFilesCount()  progressBar.CurrentFilesCount();
307                 domProgressBar.style.width = progressBar.CurrentPercent();
308                 
309                 if( progressBar.CurrentFilesCount() > 0 )
310                 {
311                    window.setTimeout("progressBar.NextFile()",0);        
312                 }
313             }            
314             
315             if(progressBar.CurrentFilesCount() == 0)
316             {                
317                 window.setTimeout("__reFlush()",500)
318             } 
319         }
320 
321         function __StartDownLoad()    
322         {   
323             imageUrls = oEditor.EditorDocument.body.getElementsByTagName("img");
324                 
325             var m; 
326             for(m = 0; m < imageUrls.length; m ++)
327             {
328                remoteList[m] = imageUrls[m].src;                      
329             }
330             
331             progressBar = new RemoteImageRubber(remoteList);              
332             domAllFilesCount.innerHTML = progressBar.TotalFilesCount();
333             
334             window.setTimeout("progressBar.NextFile()",0);
335             
336         }    
337 
338         function __reFlush()
339         {           
340             
341             domProgressBar.style.width  = "100%";
342             
343             //display the 'OK' button            
344             window.parent.SetOkButton( true ) ;
345         }
346         
347 
348     </script>
349 
350 </head>
351 <body>
352     <form id="aspnetForm" runat="server">
353         <div style="width: 300px; padding-left: 10px;">
354             <table border="0" cellspacing="0" cellpadding="2">
355                 <tr>
356                     <td nowrap="nowrap" style="width: 290px;">
357                         当前文件:&nbsp;<span id="domCurrentFile" style="display: inline; text-overflow: ellipsis"></span></td>
358                 </tr>
359                 <tr>
360                     <td style="text-align: left; width: 290px;">
361                         <div id="domProgressBarId">
362                         </div>
363                     </td>
364                 </tr>
365                 <tr>
366                     <td nowrap="nowrap" style="width: 290px;">
367                         共有:&nbsp;<span id="domAllFilesCount"></span>&nbsp;&nbsp;个文件</td>
368                 </tr>
369                 <tr>
370                     <td nowrap="nowrap" style="width: 290px;">
371                         已下载:&nbsp;<span id="domAlreadyDownloadFilesCount"></span>个。</td>
372                 </tr>
373             </table>
374         </div>
375     </form>
376 
377     <script type="text/javascript" language="javascript">
378     window.parent.SetOkButton( false ) ; 
379     
380     oEditor = window.parent.InnerDialogLoaded().FCK;       
381     
382     domProgressBar = document.getElementById("domProgressBarId");
383     domCurrentFile = document.getElementById("domCurrentFile");
384     domAllFilesCount = document.getElementById("domAllFilesCount");
385     domAlreadyDownloadFilesCount = document.getElementById("domAlreadyDownloadFilesCount");   
386 
387     window.setTimeout("__StartDownLoad()",0);  
388     </script>
389 
390 </body>
391 </html>
392 

E:\IISROOT\FckTest\FckTest\fckeditor\editor\plugins\remoteimagerubber\fckplugin.js

 1 FCKCommands.RegisterCommand(
 2     'RemoteImageRubber',
 3     new FCKDialogCommand( 'RemoteImageRubber', 
 4         FCKLang["RemoteImageRubberBtn"], 
 5         FCKPlugins.Items['remoteimagerubber'].Path + 'remoteimagerubber.aspx', 
 6         350
 7         200 ) 
 8 ) ;
 9 var oBtn=new FCKToolbarButton('RemoteImageRubber',null,FCKLang["RemoteImageRubber"],null,false,true,48);
10 FCKToolbarItems.RegisterItem('RemoteImageRubber',oBtn);
11 

E:\IISROOT\FckTest\FckTest\fckeditor\editor\lang\zh-cn.js(其他语言同样)

1 var FCKLang =
2 {
3 //
4 RemoteImageRubberBtn:   "保存远程图片"
5 };

配置一下fckconfig.js

 1FCKConfig.ToolbarSets["Default"= [
 2    ['Source','DocProps','','Save','NewPage','Preview','','Templates'],
 3    ['Cut','Copy','Paste','PasteText','PasteWord','','Print','SpellCheck'],
 4    ['Undo','Redo','','Find','Replace','','SelectAll','RemoveFormat'],
 5    ['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],
 6    '/',
 7    ['Bold','Italic','Underline','StrikeThrough','','Subscript','Superscript'],
 8    ['OrderedList','UnorderedList','','Outdent','Indent'],
 9    ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
10    ['Link','Unlink','Anchor'],
11    ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
12    '/',
13    ['Style','FontFormat','FontName','FontSize'],
14    ['TextColor','BGColor'],
15    ['FitWindow','','InsertCode','RemoteImageRubber','','About']
16] ;

[FCKEditor]FCKeditor远程图片自动上传

mikel阅读(912)

声明:原作者是武眉博<活靶子.NET>(见http://www.cnblogs.com/huobazi/archive/2007/11/02/fckeditorremoteimagerubber.html).
本人只是在此基础上进行了完善.
原有功能:保存远程图片到本地
完善后功能:
    1)使用FckEditor配置的上传路径,不必手工配置了.
    2)对于本地图片不再提交到服务器验证,节省点时间:).
    3)修正原来有时不能正常采集的bug.
    4)修正原来不能正确替换路径的问题,
      原作者是这样做的imageUrls[_imgIndex].src = localList[_imgIndex]; 经多次测试无效,无奈之下查看fck源码发现了fck使用的方法.
      这样写就没问题了:

imageUrls[_imgIndex].src = localList[_imgIndex];
imageUrls[_imgIndex].setAttribute(
"_fcksavedurl", localList[_imgIndex], 0) ;

使用方法:
    1)把remoteimagerubber.aspx和fckplugin.js复制到fckeditor/editor/plugins/remoteimagerubber/下.
    2)在fckeditor/editor/lang/下找到语言包如zh-cn.js,添加如下语句:

var FCKLang =
{
    RemoteImageRubberBtn:   
"保存远程图片",
}

    3)在fckconfig.js文件的相应位置添加工具按钮'RemoteImageRubber'
    4)在fckconfig.js文件中找到FCKConfig.PluginsPath = FCKConfig.BasePath + 'plugins/' ;有它下面添加语句FCKConfig.Plugins.Add( 'remoteimagerubber' ) ;
   
由于我的fckeditor已经集成到系统里了,所以不方便拿出来,只把需要的几个文件提供出来吧

下载
/Files/xkzi/remoteimagerubber.rar

[JQuery]240多个JQuery的插件

mikel阅读(900)

概述

JQuery 是继 prototype 之后又一个优秀的 JavaScript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不jquery及 的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 JQuery 是一个快速的,简洁的 JavaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网站提供 AJAX 交互。 JQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和 html 内容分离,也就是说,不用再在 html 里面插入一堆js来调用命令了,只需定义 id 即可。今天在Kollermedia.at上发现了一篇jQuery插件列表的文章,特推荐如下。

文件上传(File upload)JQuery_001

Ajax File Upload.
jQUploader.
Multiple File Upload plugin
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.

表单验证(Form Validation)

jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV – form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.

表单-选取框(Form – Select Box stuff)

jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery – LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).

表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)

jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.

时间、日期和颜色选取(Time, Date and Color Picker)

jQuery UI Datepicker.
jQuery date picker plugin.
jQuery Time Picker.
Time Picker.
ClickPick.
TimePicker.
Farbtastic jQuery Color Picker Plugin.
Color Picker by intelliance.fr.

投票插件(Rating Plugins)

jQuery Star Rating Plugin.
jQuery Star Rater.
Content rater with asp.net, ajax and jQuery.
Half-Star Rating Plugin.

搜索插件(Search Plugins)

jQuery Suggest.
jQuery Autocomplete.
jQuery Autocomplete Mod.
jQuery Autocomplete by AjaxDaddy.
jQuery Autocomplete Plugin with HTML formatting.
jQuery Autocompleter.
AutoCompleter (Tutorial with PHP&MySQL).
quick Search jQuery Plugin.

编辑器(Inline Edit & Editors)JQuery_002

jTagEditor.
WYMeditor.
jQuery jFrame.
Jeditable – edit in place plugin for jQuery.
jQuery editable.
jQuery Disable Text Select Plugin.
Edit in Place with Ajax using jQuery.
jQuery Plugin – Another In-Place Editor.
TableEditor.
tEditable – in place table editing for jQuery.

多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc)

jMedia – accessible multi-media embedding.
JBEdit – Ajax online Video Editor.
jQuery MP3 Plugin.
jQuery Media Plugin.
jQuery Flash Plugin.
Embed QuickTime.
SVG Integration.

图片(Photos/Images/Galleries)

ThickBox.
jQuery lightBox plugin.
jQuery Image Strip.
jQuery slideViewer.
jQuery jqGalScroll 2.0.
jQuery – jqGalViewII.
jQuery – jqGalViewIII.
jQuery Photo Slider.
jQuery Thumbs – easily create thumbnails.
jQuery jQIR Image Replacement.
jCarousel Lite.
jQPanView.
jCarousel.
Interface Imagebox.
Image Gallery using jQuery, Interface & Reflactions.
simple jQuery Gallery.
jQuery Gallery Module.
EO Gallery.
jQuery ScrollShow.
jQuery Cycle Plugin.
jQuery Flickr.
jQuery Lazy Load Images Plugin.
Zoomi – Zoomable Thumbnails.
jQuery Crop – crop any image on the fly.
Image Reflection.

Google地图(Google Map)

jQuery Plugin googlemaps.
jMaps jQuery Maps Framework.
jQmaps.
jQuery & Google Maps.
jQuery Maps Interface forr Google and Yahoo maps.
jQuery J Maps – by Tane Piper.

游戏(Games)

Tetris with jQuery.
jQuery Chess.
Mad Libs Word Game.
jQuery Puzzle.
jQuery Solar System (not a game but awesome jQuery Stuff).

表格等(Tables, Grids etc.)

UI/Tablesorter.JQuery_003
jQuery ingrid.
jQuery Grid Plugin.
Table Filter – awesome!.
TableEditor.
jQuery Tree Tables.
Expandable “Detail” Table Rows.
Sortable Table ColdFusion Costum Tag with jQuery UI.
jQuery Bubble.
TableSorter.
Scrollable HTML Table.
jQuery column Manager Plugin.
jQuery tableHover Plugin.
jQuery columnHover Plugin.
jQuery Grid.
TableSorter plugin for jQuery.
tEditable – in place table editing for jQuery.
jQuery charToTable Plugin.
jQuery Grid Column Sizing.
jQuery Grid Row Sizing.

统计图(Charts, Presentation etc.)

jQuery Wizard Plugin .
jQuery Chart Plugin.
Bar Chart.

边框、圆角、背景(Border, Corners, Background)

jQuery Corner.
jQuery Curvy Corner.
Nifty jQuery Corner.
Transparent Corners.
jQuery Corner Gallery.
Gradient Plugin.

文字和超链接(Text and Links)

jQuery Spoiler plugin.
Text Highlighting.
Disable Text Select Plugin.
jQuery Newsticker.
Auto line-height Plugin.
Textgrad – a text gradient plugin.
LinkLook – a link thumbnail preview.
pager jQuery Plugin.
shortKeys jQuery Plugin.
jQuery Biggerlink.
jQuery Ajax Link Checker.

鼠标提示(Tooltips)

jQuery Plugin – Tooltip.
jTip – The jQuery Tool Tip.
clueTip.
BetterTip.
Flash Tooltips using jQuery.
ToolTip.

菜单和导航(Menus, Navigations)

jQuery Tabs Plugin – awesome! . [demo nested tabs.]
another jQuery nested Tab Set example (based on jQuery Tabs Plugin).
jQuery idTabs.
jdMenu – Hierarchical Menu Plugin for jQuery.
jQuery SuckerFish Style.
jQuery Plugin Treeview.
treeView Basic.
FastFind Menu.
Sliding Menu.
Lava Lamp jQuery Menu.
jQuery iconDock.
jVariations Control Panel.
ContextMenu plugin.
clickMenu.
CSS Dock Menu.
jQuery Pop-up Menu Tutorial.
Sliding Menu.

http://stilbuero.de/jquery/tabs_3/

幻灯、翻转等(Accordions, Slide and Toggle stuff)

jQuery Plugin Accordion.
jQuery Accordion Plugin Horizontal Way.
haccordion – a simple horizontal accordion plugin for jQuery.
Horizontal Accordion by portalzine.de.
HoverAccordion.
Accordion Example from fmarcia.info.
jQuery Accordion Example.
jQuery Demo – Expandable Sidebar Menu.
Sliding Panels for jQuery.
jQuery ToggleElements.
Coda Slider.
jCarousel.
Accesible News Slider Plugin.
Showing and Hiding code Examples.
jQuery Easing Plugin.
jQuery Portlets.
AutoScroll.
Innerfade.

拖放插件(Drag and Drop)

UI/Draggables.
EasyDrag jQuery Plugin.
jQuery Portlets.
jqDnR – drag, drop resize.
Drag Demos.

XML XSL JSON Feeds

XSLT Plugin.
jQuery Ajax call and result XML parsing.
xmlObjectifier – Converts XML DOM to JSON.
jQuery XSL Transform.
jQuery Taconite – multiple Dom updates.
RSS/ATOM Feed Parser Plugin.
jQuery Google Feed Plugin.

浏览器(Browserstuff)

Wresize – IE Resize event Fix Plugin.
jQuery ifixpng.
jQuery pngFix.
Link Scrubber – removes the dotted line onfocus from links.
jQuery Perciformes – the entire suckerfish familly under one roof.
Background Iframe.
QinIE – for proper display of Q tags in IE.
jQuery Accessibility Plugin.
jQuery MouseWheel Plugin.

对话框、确认窗口(Alert, Prompt, Confirm Windows)

jQuery Impromptu.
jQuery Confirm Plugin.
jqModal.
SimpleModal.

CSS

jQuery Style Switcher.
JSS – Javascript StyleSheets.
jQuery Rule – creation/manipulation of CSS Rules.
jPrintArea.

DOM、AJAX和其它jQuery插件(DOM, Ajax and other jQuery plugins)

FlyDOM.
jQuery Dimenion Plugin.
jQuery Loggin.
Metadata – extract metadata from classes, attributes, elements.
Super-tiny Client-Side Include Javascript jQuery Plugin.
Undo Made Easy with Ajax.
JHeartbeat – periodically poll the server.
Lazy Load Plugin.
Live Query.
jQuery Timers.
jQuery Share it – display social bookmarking icons.
jQuery serverCookieJar.
jQuery autoSave.
jQuery Puffer.
jQuery iFrame Plugin.
Cookie Plugin for jQuery.
jQuery Spy – awesome plugin.
Effect Delay Trick.
jQuick – a quick tag creator for jQuery.
Metaobjects
.
elementReady.

英文:http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/

[C#]Entity Framework之Entity SQL(三) 1:N关系型数据的查询

mikel阅读(1055)

SQL中,要在一个一对多关系中查询数据,不免要使用JOIN关键字。在Entity Framework中,由于引入了Navigation属性的概念,我们可以通过Navigation属性,直接在多个实体之间进行查询而不必过多的关心 主键、外键约束……本文将通过一个Demo,来展现如何通过Entity SQL,方便在1对多关系的实体间进行查询。

进入正题之前,让我们来看一下当前数据库的情形,以及我们将要完成的任务。

本文主要将涉及到两个表的查询:Warehouse和Notebook。Warehouse中有三个仓库的记录;Notebook中有6台笔记本的记录;每个笔记本至多属于一个仓库,每个仓库可以存储0个或者多个笔记本。于是,在笔记本与仓库之间,构成N:1的关系。

本文将要进行两组查询,分别给出SQL查询与Entity SQL的查询语句,以方便比较。第一组查询,以1端为条件,查询多端结果;第二组查询,以多端为条件,反过来查询1端的结果。

实例1 查询出全部存放在仓库的城市为"SH"的笔记本——N到1查询

SQL实现如下:

Select n.* FROM Notebook as n

INNER JOIN Warehouse as w

ON n.WarehouseId=w.Id

Where w.City='SH'

我们把Notebook与Warehouse通过仓库ID内联以后,以1端,即Warehouse端作为条件,查询出全部在上海的笔记本。下面的Entity SQL语句,可以达到相同的效果:

Select VALUE n FROM DemoDbEntities.Notebook AS n

Where n.Warehouse.City = 'SH'

我们通过Notebook的Navigation属性——Warehouse,访问到对应的仓库所在的城市,进而来过滤出附合条件的笔记本。我们来看一个ObjectQuery的实现接口:

private static void RelNav1()

{

     string query = "Select VALUE n FROM DemoDbEntities.Notebook AS n"

                    + " Where n.Warehouse.City = 'SH'";

     using (ObjectContext oc = new ObjectContext(ConnectionString))

     {

          oc.Connection.Open();

          foreach(Notebook notebook in new ObjectQuery<Notebook>(query,oc))

          {

               Console.WriteLine("{0} {1}", notebook.Brand, notebook.Type);

          }

     }

}

其中,ConnectionString是连接字符串。这一查询模式我们在前文已经介绍过,这里不再赘述了。

实例2 查询出全部的存有品牌为"ThinkPad"或者"Lenovo"的仓库——1到N查询

SQL实现如下:

Select DISTINCT w.* FROM Notebook AS n

INNER JOIN Warehouse AS w

ON n.WarehouseId = w.Id

Where n.Brand='ThinkPad' OR n.Brand='Lenovo'

在SQL中实现的思路与实例1一样,都是把Notebook和Warehouse作内连接,只不过,把Where条件修改为n的品牌;而Select的是w.*。

Entity SQL在作1到N的查询时,稍有一点点不大一样,不过,仍然十分方便:

Select VALUE DISTINCT w FROM DemoDbEntities.Warehouse AS w, w.Notebook as nbs

Where nbs.Brand = 'ThinkPad' OR nbs.Brand='Lenovo'

我 们首先选出所有Warehouse,记为w,然后,把w.Notebook记为nbs,然后,设置查询条件nbs.Brand为"ThinkPad"或 者"Lenovo"。这里有一个顺序,在FROM子句中,允许访问在先前已经定义的别名。这就是为什么我们在定义了w之后,可以马上访问 w.Notebook。

ObjectQuery实现接口与实例1中的接口一致,唯一差别在于修改了查询串:

private static void RelNav2()

{

     string query =

          "Select VALUE DISTINCT w FROM DemoDbEntities.Warehouse AS w, w.Notebook as nbs " +

          " Where nbs.Brand = 'ThinkPad' or nbs.Brand='Lenovo'";

     using (ObjectContext oc = new ObjectContext(ConnectionString))

     {

          oc.Connection.Open();

          foreach (Warehouse w in new ObjectQuery<Warehouse>(query, oc))

          {

               Console.WriteLine("{0} {1}", w.Name, w.City);

          }

     }

}

 

我们看到,通过Entity SQL,我们需要关心的,不再是关系模型中表与表之间的关系、主键、外键、连接,而只要处理好Navigation属性即可。只要建立了Navigation属性,哪怕不存在外键约束,一样可以在多个实体集之间进行联合查询。

另外,需要说明的是,Where子句里,要求提供的是集合,而不是单个值。举例说明,当存在一个如下的查询语句:

Select VALUE DISTINCT w FROM DemoDbEntities.Notebook AS n, n.Warehouse as w

Where w.City='SH'

由于Notebook与Warehouse是多对一的关系,因此,n.Warehouse,即w必定是1,而不是集合。然后,很不凑巧,w.City又出现在了Where子句里。因此,会得到一个与下述类似的错误信息:

The specified expression must be of CollectionType.

对于以上的语句,第一,可以修改成实例1中所述的形式。另外,还有一个快速的Workaround,虽然不推荐使用,但这有利于大家理解Where子句中必须提供集合:

Select VALUE DISTINCT w FROM DemoDbEntities.Notebook AS n, {n.Warehouse} as w

Where w.City='SH'

我们把{n.Warehouse}记为w,w便成了一个集合,便可以出现在Where子句中了。

小结:

本文简单的介绍了Entity SQL在一对多查询中的应用;我们举例说明了1对多以及多对1的关系场景,并且了解到,在Entity SQL中,不再需要过多的考虑关系模型中的主外键约束情况,而更多的使用Navigation属性。

Demo下载

1. 数据库文件

2. 源代码(C#版)

Little knowledge is dangerous.

[SNS]SNS开源项目汇总

mikel阅读(777)

现在建一个sns网站就和做个论坛一样容易,因为sns的开源代码已经满天飞,这里搜集整理一些sns源码,供大家研究参考。

uchome是discuz!旗下的一款开源sns代码,目前发展迅速,使用者众多,据称1.5版本将支持第三方开发的应用组件,相信将带来更大的应用。

ThinkSNS也是php+mySQL架构,多模版,多语言支持,内置支持WordPress式插件开发,另外还有IM客户端软件。

openpne是日本主流的SNS建站程序,免费开源代码,国内有公司做了openpne中文版,不过他们竟然用来卖钱,实在是有些过分,另外OpenKaku也是基于openpne开发的一款sns产品,奇怪的是最近访问竟然是邮箱界面。

Community Server是国外重量级的sns社区源码,不过只开放了Express Edition版本,其他版本只提供了试用版。大家可以看看相关的中文化网站,能找到不少资料。

insoshi也是一个类似Facebook的建站程序,基于Ruby on Rails构建。

AROUNDMe也是类似Ning, Myspace, Google groups的一个免费社会化网站源码,自定义性非常强。


PHPizabi也是一个很强大的社会化交友平台,在国外使用较多。

CHSNS
也是一个中文sns源码项目,基于SQL+.net,虽然有免费版本,但并没有完全开源。

iSocial

免费的社会化CMS系统,可以创建类似Friendster和Orkut的站点。

Yogurt
这是基于xoops CMS的一个社会化插件.

其他社会化源码:
VMukti
Appleseed
AstroSPACES
FlightFeather
SNOSS
OpenSocialNetwork
Facelift
Mahara

部分资料来源vivalogo

[MVC]跟踪真实世界里的ASP.NET MVC项目

mikel阅读(1004)

跟踪真实世界里的ASP.NET MVC项目

文/Robert Bazinet  译/赵劼  出处/InfoQ
微软ASP.NET MVC框架的第二个技术预览版已经在三月份的MIX08大会上发布,不过它在4月16日又更新了代码。这意味着微软和社区都给这个项目带来了不少有价值的事情。人们现在不仅仅在创建示例代码,而是在创建真实的项目。
开发人员能够使用这些应用程序,而有些还处于开发之中,也可以从中学习或者使用它们来开发自己的应用程序。
MVC StoreFront
Rob Conery记 录了使用MVC框架设计和创建一个店面(storefront)的过程,并且结合了测试驱动开发等敏捷开发实践,以及Repository Pattern等常用模式。Rob 在这个领域有许多经验,他是ASP.NET 2.0 Commerce Start Kit的最早开发者,也就是后来的dashCommerce
MVC Stroefront还是一个正在进行中的系列,这使读者能够经历一个从设计到开发一个ASP.NET MVC应用程序的完整过程。系列中的每部分都包含一个针对当前部分意图的描述,以及一个视频来展示代码。

项目最新的代码能够在CodePlex上找到
博客引擎
Keyvan Nayyeri有一个使用ASP.NET MVC开发一个博客引擎(Blog Engine)的系列。建立一个博客引擎似乎是一个向人们展示技术的流行方法,而这个项目做的不错。大部分开发人员与博客关系密切。

Kigg – Digg的克隆
这个Digg的克隆产品是一个使用MVC框架的优秀实现。这个程序属于Dotnetslackers站点的一部分。这份指南面向.NET开发人员工作中的几个重要部分:
   

项目最新的代码能够在CodePlex上找到
其他一些展示ASP.NET MVC的功能的项目还刚刚起步。请继续在InfoQ站点上关注新项目以及本文这些项目的进展。

[SQL]SQL Server2005分页查询

mikel阅读(905)

Select * FROM (
    select ROW_NUMBER()Over(order by cf_id desc) as rowId,* from T_Test 
) as mytable
where rowId between 21 and 40
每页20条,第2页
ROW_NUMBER是SQLServer2005中的新特性
以下是利用本方法和传统利用Set RowCount方法存储过程的效率比较结果:
未建索引情况下:
500w数据: 存储过程1分20秒 , 新方法1分18秒
400w数据:存储过程47秒,新方法41秒
300w数据:存储过程35秒,新方法30秒
200w数据:存储过程25秒,新方法20秒
100W数据:存储过程12秒,新方法10秒
 50W数据:存储过程 7秒,新方法 0秒