[转载]jQuery:动态改变html表单的目标页(Target)

mikel阅读(1098)

[转载]jQuery:动态改变html表单的目标页(Target) – 努力,天赋,笑容,自信 – 博客园.

1、问题来源

“页面中有一个form,有些个submit按钮或者链接按钮需要点击后打开新页面。我们如何让这些个按钮将表单信息提交到正确的对应页面?”

这个问题看上去很简单。

熟悉ASP.NET开发的都应该很清楚,通过ASP.NET webform,我们可以对runat=”server”的form进行属性设置:

<form method="post" action="default.aspx" id="form1">

如你所知,method属性是http数据传输方法,action属性是要提交的目标页,至于打开新页面,设置target为_blank即可。

对于通常的页面交互,一个或多个按钮提交一个相同的表单这样做没有问题,可是如果按钮需要post的页面不尽相同,这个方法就显得无能为力。因为这种解决方法是“全局”的,设置一次,影响所有表单提交元素。

2、runat=server的form

到这里,也许有人会“幸灾乐祸”地说这都是web form的form机制不好,一个页面只能有一个runat=server的form。我们完全可以在一个页面中多定义几个form,对于不同的提交按 钮,我们给它设置不同的form(即分割提交按钮到不同的表单),这样不就解决问题了吗(新浪、网易和搜狐等很多页面,打开一个网页并查看源码可以看到很 多form,我估计都是这么用的)?

但是,这不是web form独有的“错”,其他开发框架也有类似问题:

Although this discussion uses ASP.NET WebForms as an example, realistically this is a general HTML problem although likely more common in WebForms due to the single form metaphor it uses. In ASP.NET MVC for example you’d have more options by breaking out each button into separate forms with its own distinct target tag. However, even with that option it’s not always possible to break up forms – for example if multiple targets are required but all targets require the same form data to the be posted.

原文的评论中一个哥们回复说:

“Good post, as always, but have you noticed that literally everything you want to do with webforms requires a hack or workaround? It’s always some rudimentary thing that is easy to do in any other web platform or framework, but the webforms abstraction always rears it’s ugly head. Bleh, the further I get away from webforms, the more productive I have become.

”ugly“一词用的真是形象且险恶。好在Rick及时回复说:

# re: Changing an HTML Form’s Target with JQuery
by Rick StrahlFebruary 03, 2011 @ 12:00 am @Jeff – this isn’t specific to WebForms as I pointed out at the top of the page. The same applies to MVC or any other framework that has multiple POSTable options for submission. Admittedly, with WebForms your options are more limited as you can’t easily add additional forms, but when you need to submit form variables to multiple target actions there are no choices regardless of platform…

还有,我感觉回复者Jeff这个名字挺有喜感的。

3、简单实用的解决方案

(1)、直接使用linkbutton或者链接控件?

通常情况下,我们很容易想到用现成的link控件的属性来实现页面提交。比如LinkButton吧:

  <asp:LinkButton runat="server" ID="btnNewTarget" Text="New Target" 
                     target="_blank"  OnClick="bnNewTarget_Click" />

虽然LinkButton没有Target属性,但是像上面那样设置也没有问题。

但是,最怕的就是这个但是。在查看生成的html源码的时候:

<a id="btnNewTarget" target="_blank"    href="javascript:__doPostBack(&#39;btnNewTarget&#39;,&#39;&#39;)">New Target</a>

我们发现生成的html源码里a元素的href属性已经被设置了一段让人眼熟的控制回发脚本。就是这一段脚本,让我们提交数据到新窗口的目的落空。为什么呢?

What happens with a target tag is that before the JavaScript actually executes a new window is opened and the focus shifts to the new window. The new window of course is empty and has no __doPostBack() function nor access to the old document. So when you click the link a new window opens but the window remains blank without content – no server postback actually occurs.

原文解释的还算清楚简单,good,fabulous,excellect…词穷。

(2)、为这些个按钮设置form的Target吧!

通过下面的脚本,可以轻松实现我们的预定功能:

    $("#btnButtonNewTarget,#btnNewTarget").click(function () {
            $("form").attr("target", "_blank");
        });

对于同一个页面post(示例中是default.aspx页面),它和(1)的效果截然不同。可能您习惯要问为什么,原文是这样解释的:

So why does this work where the target attribute did not? The difference here is that the script fires BEFORE the target is changed to the new window. When you put a target attribute on a link or form the target is changed as the very first thing before the link actually executes. IOW, the link literally executes in the new window when it’s done this way.
By attaching a click handler, though we’re not navigating yet so all the operations the script code performs (ie. __doPostBack()) and the collection of Form variables to post to the server all occurs in the current page. By changing the target from within script code the target change fires as part of the form submission process which means it runs in the correct context of the current page. IOW – the input for the POST is from the current page, but the output is routed to a new window/frame. Just what we want in this scenario.

看原文这里可能有点绕人,解释太多,有点抓不住重点。我认为关键要理解原文中的“表单提交进程(form submission process)”。点击按钮的时候,在当前页面通过脚本改变表单的Target,这只是表单提交进程的一部分(By changing the target from within script code the target change fires as part of the form submission process)。

那么真正的“表单提交进程”发生了什么呢?顺着原文的意思,看上去好像是新页面打开,前一页的表单数据提交到新打开的页面,貌似是前一页 (current page)的_doPostPack函数“跳”到当前新打开的页面(也叫current page)触发ClickHandler……不就是“current page”的置换吗?可能我自己的理解现在还有偏差,英语水平下降得令人抓狂,必须要补补了。如果您有更合适的好理解的解释说明,请不吝赐教。

多说一句,点击前一个页面,在新打开的页面触发事件。我kao,这多像江湖中传说已久的乾坤大挪移啊?

By the way,我们还可以在不同的新页面中post传参,您可以将demo中的Default页面的form的action设置为 “TargetPage.aspx”试一下。其实我自己在开发中也曾经碰到过Rick文中所述的类似问题。我的解决方法通常都是对于某一个按钮,直接通过 JavaScript写个函数:先找到要操作的form,修改action,然后调用form的submit方法打开新窗口,真不如Rick原文中的来得 简洁。

demo下载:SimpleWebApp

[转载]构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈

mikel阅读(934)

[转载]【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈 – ASP.NET 架构 – 博客园.

前言:从本篇开始就真正的进入了性能调优的阶段,在之前的文章中提到了页面加载过慢的四个性能问题,其中第一个问题就是:服务端解析.aspx页面的时间过长,本篇就分析这个问题,给出一些方案,因为涉及到的问题很多,的在后续文章会逐个详细介绍。

因为本篇的篇幅过长,所以划分为了多篇。

本篇的议题如下:

识别和分析服务端的性能瓶颈()

内存

缓存

CPU

处理请求线程

提高性能的一些改进措施(下)

部署优化(前篇)

不必要回传(中篇)

不必要的请求(后篇)

在服务端有很多可以优化的地方,优化的话题也很多,在本篇中我们主要关注:如果让服务端更快的生成页面,同时也关注如果更快的让生成的页面更快的到达客户端浏览器。

其实我们就是在优化下面的时间线:

要缩短上面的那条时间线,就需要服务端更好的利用它的资源,例如更好的利用和分配内存资源,CPU资源等。如何好的充分利用这些资源,一定程度上与我们写的代码的质量息息相关,一段好的,高效的代码往往可以让我们少花钱去更多的硬件设备(所以代码的质量非常重要)。

下面我们就来看看服务端一般可能出现的性能瓶颈:

内存不足

缺乏缓存

CPU压力

处理请求线程问题

接下来会介绍如 何采用系统的性能诊断工具来辨明:到底是哪种性能瓶颈导致了服务端解析页面过慢。在用性能诊断工具找出了问题之后,然后针对问题再次做详细的分析,同时收 集数据,根据这些数据来采用对应的措施,对症下药。至于每一种性能问题如何采取何种措施解决,我们后面的文章会一章章的详细详述,请大家稍安勿躁,在此我 们先学会发现问题。发现站点的可能出现了性能问题之后,首先不要立刻的修改站点或者服务器,而是要先诊断出瓶颈出现在哪里。J

内存

首先要判断服务器是否内存不足。因为如果内存不足,那么会增加服务器的CPU压力和磁盘的IO读写操作,发过来说,如果解决了内存不存的问题,自然而然的就减少了CPU和磁盘IO读写操作。

为什么内存不存会增加CPU的压力和磁盘的IO读写操作?

当系统的内存不足的时候,系统就会把原来需要放在内存的一些数据转移保存在磁盘上面,保存为pagefile.sys。当这些数据被需要的时候,那么系统就会去读写磁盘。读写磁盘的操作会消耗CPU资源,同时增加了磁盘的IO操作。

下面我们就来看看,如何识别内存不足性能瓶颈。

我们主要讲述如何在Window服务器系统中诊断这个问题。

Window Server 2003

在系统的命令行中输入perfom。就会弹出如下的窗口。然后点击工具栏上面的”+”按钮,在Performance object下拉框中选择Memory,然后再选择Pages/sec计数器。如果这个值很大,就说明CPU在内存和磁盘之间不断的交换数据。

Windows Vista, Server 2008, Window 7

Windows VistaWindows Server 2008Window 7中不仅可以运行”perfmon”,打开性能监视窗口。而且可以运行resmon来开启资源监视窗口,从这个窗口看,可以更加直观。在资源监视窗口中看到硬错误/”(Hard Faults/sec).然后检查每个进程的这个值,如果进程的硬错误/数值很高,那么就说明服务器已经是内存不足了。(我们将会在后续的文章讲述如何解决这个问题,此处我们先讲述如何找出这个问题)

缓存

大家都知道,在适当的实用缓存策略可以极大的提高服务端的性能。我们一般把数据缓存在内存中,例如浏览器的内存,代理服务器的内存等。而且可以把一些常用的对象,部分的页面,甚至整个页面缓存起来。

缓存的好处有很多,如下:

缩短服务端的响应时间

减少CPU的使用压力

避免频繁的读取数据库

如果把数据缓存在浏览器或者代理服务器,还可以减少不必要的回传。

一般来说,我们把一些使用很频繁的数据或者每次生成都要花费大量资源的数据缓存起来。

但是如何才算得上是使用很频繁

没有一定的标准了,还是那句话:看情况!例如,如果一个页面在1秒钟之内被请求了10次,可能相比较其他的页面而言,这个页面的请求不算””频繁(其他的页面在1秒之内请求100),但是如果把这个页面缓存1秒,也是对性能的极大提升,因为可以一秒之内,有90%的请求都是由缓存响应的。大家可以去参看一下缓存的5分钟法则。至于如何进行缓存,在后面的文章讲解。

CPU

还是和之前内存诊断一样,我们可以运行perfmon命令,然后在Processor分类下面选%Processor Time计数器。如下:

同时,我们还可运行resmon来打开“资源监视窗口”来看:

大家可以看到第一个标红色框的CPU列,其实这个就是反应了 %Processor Time计数器监控的结果。一般来说,如果某个进程的这个值高于了80%,那么就说明这个进程对CPU资源有很大的消耗。如果是w3wp.exe这个进程消耗了80%,就说你的站点消耗了大量的CPU。我们会在后续的文章讲述:如果减小CPU的压力。

处理请求线程

我们知道:发送到服务器的每一个请求,都是有应用程序池中的一个线程来处理的。而且用来处理请求的线程的数量是有IIS来控制的,如果应用程序池中没有空闲的线程来处理新的请求,那么这个请求就被放在请求队列中进行等待。如果在服务端的请求队列太长了,服务器忙不过来,那么新来的请求很有可能被服务器拒绝。

一般来说,一个应用程序池中的可用的线程数量由服务端安装的.NET Framework的版本和IIS的一些设置来决定的。

.NET Framework Version 默认的可用线程数
1.1 20*CPU的数量-8
2.0 12* CPU的数量
3.5, 4.0 IIS 7经典模式:12* CPU的数量
IIS 7 集成模式: 100* CPU的数量

如果在服务端没有足够的线程来处理请求,这种情况就是所谓的线程饥饿。我们可以通过系统的性能计数器来检查站点的服务端是否发生了这种情况:

1. 在命令窗口运行perfmon”.如下:

2. 在打开的性能监视窗口中,选择性能监视器,如下:

3. 点击“+”按钮,然后展开ASP.NET分类:

4. 添加如下计数器:

Request Execution Time 处理一个请求花费的时间(单位是:毫秒)
Request Current 现在ASP.NET运行时要处理的请求数量,包括正在处理的请求和等待队列中的请求。

5. 然后展开ASP.NET Applications”分类,添加如下计数器:

Request Executing 现在正在被处理的请求数

如果”Request Current”的数量大于了Request Executing的数量,那么就说明有请求在等待被处理。后面的文章会详细讲述如何处理这种情况。

OK,今天就暂时发上这些,贵在理解和操作。下一篇接着讲述。

[转载]安装Android开发环境

mikel阅读(1401)

[转载]安装Android开发环境 – 徐文兵的IT博客 – 博客园.

注:在安装之前,确保你的登陆系统账号非中文账号。

中文账号 Eclipse 不能识别中文账号对于的文件夹

Step One 安装Java 并配置系统变量
直接进入:http://java.com/zh_CN/download/installed.jsp
验证当前系统的java版本(注当前好多操作系统默认带Java),更新java

配置系统变量(设置默认java安装位置为C:\Program Files\Java\jre6)
CLASSPATH  : .;C:\Program Files\Java\jre6;
JAVA_HOME  : C:\Program Files\Java\jre6
Path       : C:\Program Files\Java\jre6\bin;C:\Program Files\Android-sdk-windows\tools

Step Two 安装 JDK(Java Development Kit ),an
1) 进入 http://www.oracle.com/网站–> Java–>Java SE–> Downloads
当前的window 下载路径为:https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter
2)下载 jdk 并安装。

Step Three 安装Android SDk

SDk下载路径: http://androidappdocs.appspot.com/sdk/index.htmlhttp://developer.android.com/sdk/ Ip被封了

下载并安装

Step four 下载Eclipse
1)进入Eclipse官方网站:http://www.eclipse.org/downloads/  选择Eclipse IDE for Java EE Developers
并下载。

2)下载完成后,选择目录进行解压(绿色软件无需安装)

Step five 在Eclipse中安装 Android插件
1)打开Eclipse 软件 ,选择菜单项Help–>install new software
Work with 输入:https://dl-ssl.google.com/android/eclipse/

2) 选择菜单项Window –>Preference窗体 ,选择Android SDK Location:

输入: C:\Program Files\Android\android-sdk-windows

[转载]Android应用程序中资源访问知识小结

mikel阅读(948)

[转载]Android应用程序中资源访问知识小结 – 宁 静 致 远 – 博客园.

Android作为新兴移动操作系统,有众多的优点供我们仔细学习和体会,这里主要总结 一下Android应用程序开发过程中对各种资源的管理和访问,也可以从IOC的角度来理解,即在开发过程中,让对象、组件以及服务之间的依赖关系分离的 原则,这里也就是将应用程序所涉及代码和非代码两部分分离,其好处多多,也不一一列举,经过一番总结,特列下表中:

Android的资源访问 (2)

若从Eclipse开发环境中的目录结构看,如下图所示:

Android资源文件

以上是我对Android应用开发中对资源文件的管理相关知识的小结,如对大家起到一点点的提示作用,也就心满意足了,如有错误,敬请指点赐教,谢谢,

[转载]Android 中文API合集(4)(102篇)(chm格式)

mikel阅读(914)

[转载]Android 中文API合集(4)(102篇)(chm格式) – 农民伯伯 – 博客园.

前言

Android中文翻译组 , Android 中文chm , Android 中文pdf , android 中文 api

Android中文翻译组第四个chm格式合集,收集整理102篇译文制作成合集,参与章节翻译名单:AtomicAmanAndroid Club SYSUcnmahjcoficeHalZhanghenly.zhangjiahuibinKunloveshirui madgoatpengyouhongTinawallace20100_1凌云健笔逝憶流緣天涯明月刀Haiya 胡蝶、桂仁、唐明、颖哥儿、思考的狼德罗德、首当其冲、CN七号、麦子獨鍆躌踄我是谁、一昕、六必治农民伯伯

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、截图

二、章节

三、下载

CHM格式:

Android 中文API合集(4)(102篇)(chm格式)

注意:

如果您是windows2003或windows2008操作系统,请在chm文件上点击右键,选择属性,在弹出的对话框中,点击“解除锁定”,就可以了。 XP chm文件打不开的原因

PDF格式:

Android 中文API合集(4)(102篇)(pdf格式)

四、公告

由于春节耽误审稿及合集推迟发布,第5个合集将累积到4月份发布,敬请谅解!

结束

感谢大家的关注和支持,欢迎加入我们!

[转载]ubuntu 10.10下搭建android开发环境

mikel阅读(956)

[转载]ubuntu 10.10下搭建android开发环境 安装必要工作用软件 – Android火鸟 – 博客园.

进了新公司之后,工作环境有了很大的变化,以前都是在windows环境下进行程序开发,没怎么接触linux系统,新项目组中有6个同事,一水的ubuntu,木有办法,我也换成ubuntu吧。

曾经在学linux下c语言编程的时候,学过一个月的linux,熟悉了一些命令,稍微能在linux系统下完成一些日常的需求了,也搭建过 Android的开发环境,呵呵,时间长了,以前的东西又都忘了,由于那个时候也没把搭建环境的步骤进行记录,现在又抓瞎了,废了很大的劲,终于搭建完 了,记录一下,为以后做好准备。

公欲善其事,必先利其器。在ubuntu下进行开发,就必须要熟悉ubuntu下常用的,能提高效率的工作软件,例如星际译王,gvim等等,目前我只知道这几个软件不错。

搭建Android的开发环境

1. 安装jdk,配置jdk的环境变量

首先,从http://java.sun.com中下载jdk,我的版本是jdk1.6.0_12,我下载的是bin文件,我将下载的 jdk1.6.0_12.bin文件置于/usr/lib/jvm/java(目录任意)中。如果bin文件存在于例如“下载”等类似的目录中时,要将 bin文件拷贝到/usr目录中,需要先修改bin文件的权限,在shell中执行:
sudo chmod u+x /usr/lib/jvm/java/jdk1.6.0_12.bin 修改bin文件权限,使其可执行然后,执行
sudo /usr/lib/jvm/java/jdk1.6.0_12.bin (安装jdk)
将会出现字幕,持续按回车键,直至屏幕显示要求输入 yes/no,此时输入y回车,将会把jdk解压到文件夹,得到jdk1.6.0_12目录。
此时,jdk已安装完毕。jdk将会安装在源文件所在的目录中。下面进行配置jdk的环境变量了。
执行:
sudo vi /etc/environment
在environment中修改,出现如下部分
引用:
PATH=”……:/usr /lib/jvm/java/jdk1.6.0_12/bin”(这个地方有引号,下面的classpath和java_home都没有引号)
CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_12/lib
JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_12

执行:
sudo source /home/用户名/.bashrc(这行代码不执行也不一定错误)
此时,环境变量设置成功(设置环境变量的方法很多,不一一列举)
由于ubuntu10.10 中自带有默认的jdk–openjdk,所以,为了使默认使用的是我们安装的jdk,还要进行如下工作。
执行:
update-alternatives –install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300
格式:update-alternatives –install /usr/bin/java java 用户的jdk的bin目录/java 300

update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300
格式同上
通过这一步将我们安装的jdk加入java选单。
然后执行:
update-alternatives –config java
通过这一步选择系统默认的jdk
这样,再在shell中输入:
java -version时,就会显示系统使用的java是sun的java,至此,jdk安装成功,环境变量设置成功。

2. 安装 ADT

如何安装见开发文档

3. 安装Android sdk

3.1 可以采取自己下载sdk或者拷贝别人sdk的方法,那种方法都可以,这个不重要,关键是配置sdk的环境变量

3.2 配置sdk的环境变量

从android 2.3开始,sdk的目录结构发生了变化,多了一个plthforms-tools文件夹,adb文件有tools文件夹移动到了这个目录,因为不能只配 置tools文件夹的环境变量,还需配置platforms-         tools文件夹的环境变量,配置方式和配置java的环境变量一样,秩序在Path后依次添加两个文件夹的路径即可。

至此,android在ubuntu下的开发环境已经搭建成功。

4. 安装eclipse插件

插件:findbugs,subclipse

关于subclipse的使用教程,现在还不会用,等用上一段时间后,会进行总结。

在安装subclipse的时候,可能会报找不到JAVAHL库

解决办法:

执行sudo  apt-get –fix-missing  install libsvn-java命令安装库, 然后在eclipse.ini下面添加  -Djava.library.path=/usr/lib/jni 即可。

安装ubuntu软件

1. 星际译王,gvim,直接在软件中心进行安装即可。

2. 安装rar解压软件

sudo apt-get install unrar

3. 安装虚拟机

sudo add-apt-repository “deb http://download.virtualbox.org/virtualbox/debian maverick non-free”

wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add –

sudo apt-get update

sudo apt-get install virtualbox-ose

4. 文件对比软件 meld

sudo apt-get install meld

目前急需的一些软件

类似于windows下的onenote的日常文档管理软件

类似于outlook的邮件管理软件

类似欲live writer的写博客的软件

这些软件的替代品暂时还没找到,刚入手ubuntu,还有写无从下手的感觉。

[转载]ASP.NET MVC中的扩展点(十)辅助方法

mikel阅读(1158)

[转载]MVC中的扩展点(十)辅助方法 – xfrog – 博客园.

MVC中的辅助方法与ASP.NET中的服务器控件类似,都是用于生成特定的HTML代码。MVC提供了三个辅助类,它们分别是:用于生成HTML元素的 HtmlHelper,用于Ajax处理的AjaxHelper,以及用于生成Url的UrlHelper。这三个辅助类通过ViewPage的 Ajax、Html、Url属性向外提供。由于视图都是是从ViewPage继承的,所以,我们在视图模板中可以直接通过这三个属性来调用辅助方法。

AjaxHelper、HtmlHelper、UrlHelper位于System.Web.Mvc命名空间中,如以下类图所示,这三个辅助类本身仅包含 了一些基本的方法和属性,而具体辅助方法的实现,MVC是采用了扩展方法的技术。如:AjaxHelper通过System.Web.Mvc.Ajax命 名空间中的AjaxExtensions静态类来实现,HtmlHelper通过System.Web.Mvc.Html命名空间中的一系列静态扩展类来 实现。

Helper

这种将具体辅助方法分离到单独命名空间的做法,有利于我们对辅助方法的扩展及替代:

1、要添加新的辅助方法,我们只 需建立自己的静态扩展类,然后在web.config配置文件中添加对扩展类所在命名空间的引 用:<pages><namespaces><add namespace=”静态扩展类所在命名空间”/></namespace></pages>

2、要替换所有默认的辅助方法,我们只需将web.config配置文件中的特定命名空间,如System.Web.Mvc.Html替换为自己的命名空间即可。

模板系统

由DisplayExtensions静态扩展类提供的Html.Display、Html.DisplayFor、 Html.DisplayForModel辅助方法用于根据模型类型自动产生显式Html代码,由EditorExtensions静态扩展类提供的 Html.Editor、Html.EditorFor、Html.EditorForModel辅助方法用于根据模型类型自动产生用于编辑的Html代 码。它们都是建立在模板基础上的:根据模型属性类型,从默认的模板集合中取出相应的模板,然后根据模板内容生产相应的Html元素。

如以下类图所示,通过一些列的特性,可控制模板系统的行为:

TemplateHelper

Html.DisplayForModel和Html.EditorForModel在产生模型的显示/编辑界面时,直接跟具模型每个属性的类型及特性定义来产生每一个属性的Html元素。我们可以通过子视图来定义特定模型的呈现方式,其具体步骤如下:

1、在工程 Views\Shared目录下创建两个新的文件夹:DisplayTemplates和EditorTemplates,其中 DisplayTemplates文件夹用于保存模型显式界面的模板(由Html.DisplayForModel辅助方法使 用),EditorTemplates文件夹用于保存模型编辑界面的模板(由Html.EditorForModel辅助方法使用)。

2、在相应文件夹下添加新的视图文件,名称必须和模型类名完全一致,勾选“创建子视图选项”。

3、与视图模板一致,可在子视图中访问ViewData及Model

当我们定义完子视图后,模板系统首先根据模型类型名在相应文件夹中查找是否有自定义的模板,如果有则使用自定义模板,没有则使用默认模板。

Mvc通过一些列特性来控制模板系统的行为,但是在有些情况下,模型源代码我们是不能修改的,比如由Linq to SQL或.NET实体框架产生的模型类,这些类由工具自动产生,我们无法直接修改源代码。幸运的是,这些自动产生的类都是定义为partial的,这样我 们可以使用System.ComponentModel.DataAnnotations命名空间下的MetadataTypeAttribute特性来 定义一个与模型相关的元数据类型,例如,Product模型类型定义如下:

namespace CnBlogs.TestModel
{
    public partial class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

.codearea { color: black; background-color: white; line-height: 18px; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,”BitStream Vera Sans Mono”,courier,monospace,serif; }.codearea pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap pre { white-space: pre-wrap; word-wrap: break-word; }.codearea pre.alt { background-color: rgb(247, 247, 255) ! important; }.codearea .lnum { color: rgb(79, 129, 189); line-height: 18px; }我们可以定义与之相关的元数据类:

namespace CnBlogs.TestModel
{
    [MetadataType(typeof(ProductMetadata))]
    public partial class Product
    {
        private class ProductMetadata
        {
            [DisplayName("产品名称")]
            public string Name { get; set; }
            [DisplayName("备注")]
            public string Description { get; set; }
        }
    }
}

.codearea { color: black; background-color: white; line-height: 18px; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,”BitStream Vera Sans Mono”,courier,monospace,serif; }.codearea pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap pre { white-space: pre-wrap; word-wrap: break-word; }.codearea pre.alt { background-color: rgb(247, 247, 255) ! important; }.codearea .lnum { color: rgb(79, 129, 189); line-height: 18px; }只需注意:模型类型必须定义为partial,与模型关联的元数据定义包含到分离的模型类中,是模型类的一个内嵌类。最后通过MetadataType特性来指定元数据类型。

源代码下载

[转载]Android应用程序主要组件知识小结

mikel阅读(1400)

[转载]Android应用程序主要组件知识小结 – 宁 静 致 远 – 博客园.

Android系统中通过几个主要的组件以其灵活的组织方式在方便了开发者的同时,也不失其炫丽的效果,实在是值得我不断深入了解和学习,下面的图作为近一段时间对Android组件知识的一个小结,难免有遗漏或错误之处,敬请各位不吝赐教。

Android应用程序组件

我觉得深刻理解和掌握这几个组件的使用方法以及相互关系,就相当于把握了Android应用程序的主要经络,更能理清我们的思路,上面图中所示,乃是我占用了几个钟头的休息时间,整理出来 的,难免有遗漏和错误之处,拿出来共享一下,也当作是抛砖引玉了,

[转载]分享一个Winform下的分页控件

mikel阅读(1315)

[转载]分享一个Winform下的分页控件 – 邀月工作室 – 博客园.

前两天有一个简单的C/S项目用到分页,因为是Winform下,没有现成的,自己也懒得写,就找了下,看到了ycmoon的一个控件

http://www.cnblogs.com/ycmoon/archive/2010/01/07/1640689.html

参考后,做了简化,只保留了分页的部分,主要是点击事件的Delegate,未做过多测试,有兴趣的朋友可以下载源码自行修改,如有好的建议,也可以给我反馈。3w@live.cn,效果如下:

控件设计界面:

邀月工作室

设计时:

邀月工作室

运行时:

邀月工作室

附带一个取分页数据的存储过程:

View Code

Create DataBase Db_TonyPaging go use Db_TonyPaging go if exists (select 1 from sysobjects where id = object_id('DepartDemo') and type = 'U') drop table DepartDemo go /*==============================================================*/ /* Table: DepartDemo */ /*==============================================================*/ create table DepartDemo ( PKID int identity(1,1), DName nvarchar(200) null, DCode nvarchar(500) null, Manager nvarchar(50) null, ParentID int null default 0, AddUser nvarchar(50) null, AddTime datetime null, ModUser nvarchar(50) null, ModTime datetime null, CurState smallint not null default 0, Remark nvarchar(500) null, F1 int not null default 0, F2 nvarchar(300) null, constraint PK_DEPARTDEMO primary key (PKID) ) go truncate table DepartDemo go /***************创建54 条测试数据********************* ****************downmoo 3w@live.cn ***************/ declare @d datetime set @d=getdate() declare @i int set @i=1 while @i<=54 begin --插入一条测试数据 insert into DepartDemo select '国家统计局房产审计'+Cast(@i as Nvarchar(10))+'','0','胡不归',0,'DemoUser',getdate(), '','1900-01-01',1,'专业评估全国房价,为老百姓谋福祉',0,'' set @i=@i+1 end go --***********分页存储过程用于SQL server2005/2008、2008R2**************************** SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create PROCEDURE [dbo].[ZJF_CPP_GetPagedRecordFor2005_2008] (@Table varchar(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID @TIndex nvarchar(100), --主键,可以带表头 a.AID @Column nvarchar(2000) = '*',--读取字段 @Sql nvarchar(3000) = '',--Where条件 @PageIndex int = 1, --开始页码 @PageSize int = 10, --页大小 @Sort nvarchar(200) = '' --排序字段 ) AS DECLARE @strWhere varchar(2000) declare @strsql nvarchar(3900) IF @Sql IS NOT NULL AND len(ltrim(rtrim(@Sql)))>0 BEGIN SET @strWhere = ' WHERE ' + @Sql + ' ' END ELSE BEGIN SET @strWhere = '' END if (charindex(ltrim(rtrim(@TIndex)),@Sort)=0) begin if(@Sort='') set @Sort = @TIndex + ' DESC ' else set @Sort = @Sort+ ' , '+@TIndex + ' DESC ' end IF @PageIndex < 1 SET @PageIndex = 1 if @PageIndex = 1 --第一页提高性能 begin set @strsql = 'select top ' + str(@PageSize) +' '+@Column+ ' from ' + @Table + ' ' + @strWhere + ' ORDER BY '+ @Sort end else begin /**//**//**//*Execute dynamic query*/ DECLARE @START_ID nvarchar(50) DECLARE @END_ID nvarchar(50) SET @START_ID = convert(nvarchar(50),(@PageIndex - 1) * @PageSize + 1) SET @END_ID = convert(nvarchar(50),@PageIndex * @PageSize) set @strsql = ' SELECT '+@Column+ ' FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum, '+@Column+ ' FROM '+@Table +' WITH(NOLOCK) ' + @strWhere +') AS D WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY '+@Sort END EXEC(@strsql) print @strsql set @strsql = 'SELECT Count(1) as TotalRecords FROM ' + @Table +' WITH(NOLOCK) ' + @strWhere print @strsql EXEC(@strsql)

在WinForm项目中,需要设置控件的总记录数RecordCount(由分页存储过程计算得出),和翻页事件winFormPager1_PageIndexChanged

邀月工作室
邀月工作室

邀月工作室

测试源码如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace DemoPager { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } #region Members //总记录数 public int RecordCount = 0; private string strConn = @"Data Source=ap2\vegnet;Initial Catalog=Db_TonyPaging;Integrated Security=SSPI;"; //"Server=localhost;database=Db_TonyPaging;uid=sa;pwd=sa;"; private string strProcedure = "ZJF_CPP_GetPagedRecordFor2005_2008"; #endregion #region Methods /// <summary> /// 绑定第Index页的数据 /// </summary> /// <param name="Index"></param> private void BindDataWithPage(int Index) { winFormPager1.PageIndex = Index; //winFormPager1.PageSize = 10;; ; dgvList.DataSource = GetData(strConn, strProcedure, Index, winFormPager1.PageSize); //获取并设置总记录数 winFormPager1.RecordCount = RecordCount; } /// <summary> /// 获取数据源 /// </summary> /// <param name="conn"></param> /// <param name="strProcedure"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> private DataTable GetData(string conn, string strProcedure, int pageIndex, int pageSize) { using (SqlConnection connection = new SqlConnection(conn)) { SqlCommand command = new SqlCommand(strProcedure, connection); command.CommandType = CommandType.StoredProcedure;//采用存储过程 //存储过程参数 command.Parameters.Add("@Table", SqlDbType.NVarChar, 1000).Value = "DepartDemo"; command.Parameters.Add("@TIndex", SqlDbType.NVarChar, 100).Value = "PKID"; command.Parameters.Add("@Column", SqlDbType.NVarChar, 2000).Value = "*"; command.Parameters.Add("@Sql", SqlDbType.NVarChar, 3000).Value = " 1=1 "; command.Parameters.Add("@PageIndex", SqlDbType.Int, 8).Value = pageIndex.ToString(); command.Parameters.Add("@PageSize", SqlDbType.Int, 8).Value = pageSize.ToString(); command.Parameters.Add("@Sort", SqlDbType.NVarChar, 200).Value = " PKID desc"; //打开连接 if (connection.State != ConnectionState.Open) { connection.Open(); } try { //填充数据 SqlDataAdapter da = new SqlDataAdapter(command); DataSet ds = new DataSet(); da.Fill(ds); //获取总记录数 RecordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]); //返回数据集 return ds.Tables[0]; } catch (SqlException err) { MessageBox.Show(err.Message); return null; ; } finally { connection.Close(); } } } #endregion #region Events private void frmMain_Load(object sender, EventArgs e) { //不自动生成列 dgvList.AutoGenerateColumns = false; //绑定数据 BindDataWithPage(1); } /// <summary> /// 翻页事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void winFormPager1_PageIndexChanged(object sender, EventArgs e) { BindDataWithPage(winFormPager1.PageIndex); } #endregion } }

下载控件源码及演示程序(含SQL)

下载地址一

下载地址二

邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
助人等于自助!   3w@live.cn

[转载]八款开源Android游戏引擎

mikel阅读(1186)

[转载]八款开源Android游戏引擎 – 语虫 – 博客园.

很 多初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游 戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。

事实上,这种想法完全是没有必要且不符合实际的,作为能和苹果iOS分庭抗礼的Android(各种意义上),当然也会有相当数量的游戏引擎存在。仅仅因为我们处于这个狭小的天地间,与外界接触不够,所以对它们的存在茫然不知罢了。

下面我就罗列出八款常见的Android游戏引擎,以供有需要者参考(收费,下载量过小,不公布源码,以及鄙人不知道(-_-)的引擎不在此列)。

1、Angle


Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。

最低运行环境要求不详。

项目地址:http://code.google.com/p/angle/

2、Rokon


rokon 是一款Android 2D游戏引擎,基于OpenGL ES技术开发,物理引擎为Box2D,因此能够实现一些较为复杂的物理效果,该项目最新版本为 2.0.3 (09/07/10)。总体来说,此引擎最大的优点在于其开发文档相当之完备,并且项目作者对反馈Bug的修正非常之神速,所以该框架的使用在目前也最为 广泛,有人干脆将它称为Cocos2d-iPhone引擎的Android版(业务逻辑和编码风格上也确实很像)。附带一提,国内某个需要注册会员才能下 载的Android游戏框架衍生于此框架,所以大家也不要刻板的认为收费便一定是好的,免费就一定不好。

最低运行环境要求为Android 1.5。

项目地址:http://code.google.com/p/rokon/

3、LGame


LGame 是一款国人开发的Java游戏引擎,有Android及PC(J2SE)两个开发版本,目前最高版本同为0.2.6(31/07/10)。其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本 间主要代码能够相互移植。Android版内置有Admob接口,可以不必配置XML直接硬编码Admob广告信息。

该 引擎除了基本的音效、图形、物理、精灵等常用组件以外,也内置有Ioc、xml、http等常用Java组件的封装,代价是jar体积较为庞大,PC版 已突破1.2MB,Android版有所简化也在500KB左右。此外,该引擎还内置有按照1:1实现的J2ME精灵类及相关组件,可以将绝大多数 J2ME游戏平移到Android或PC版中。唯一遗憾的是,该项目作者是个极其懒惰的家伙,开发文档从去年说到今年依旧没有提供,只有游戏示例可供下 载。

最低运行环境要求为Android 1.1。

项目地址:http://code.google.com/p/loon-simple/

4、AndEngine


andengine同样是一款基于OpenGL ES技术的Android游戏引擎,物理引擎同样为Box2D(标配|||)。该框架性能普通,文档缺乏,但示例较为丰富。

下载地址(未直接提供jar下载,源码可通过svn提取):http://code.google.com/p/andengine/

最低运行环境要求不详。

项目地址:http://code.google.com/p/rokon/

5、libgdx


libgdx 是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D游戏开发,物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的 Android游戏引擎,但缺陷在于精灵类等相关组件在使用上不够简化,而且文档也较为匮乏。

最低运行环境要求不详。

项目地址:http://code.google.com/p/libgdx/

6、jPCT


jPCT 是一款基于OpenGL技术开发的3D图形引擎(PC环境为标准OpenGL,Android为OpenGL ES), 以Java语言为基础的,拥有功能强大的Java 3D解决方案。该引擎与LGame(此为2D游戏引擎)相类似,目前拥有PC(J2SE)以及Android两个开发版本。

jPCT 的最大优势之一,就在于它惊人的向下兼容性。在PC环境中,jPCT甚至可以运行在JVM1.1环境之中,因为jPCT内部提供的图形渲染接口完 全符合所有的Java 1.1规范(就连已经消失的Microsoft VM乃至更古老的Netscape 4 VM也不例外)。

最低运行环境要求为Android 1.5。

项目地址:http://www.jpct.net/jpct-ae/

7、Alien3d 

Alien3d 是一款体积非常之小的Android 3D游戏引擎,基于OpenGL ES技术开发。为了压缩体积,它根据不同功能采用多jar方式发布(包括alien3d-engine.jar,alien3d- tiled.jar,alien3d-sprites.jar,alien3d-shapes.jar,alien3d- particles2d.jar,),事实上它的核心文件大约只有40KB,所有相关jar的总和也不足150KB。

最低运行环境要求为Android 1.5。

项目地址:http://code.google.com/p/alien3d/

8、Catcake


Catcake是一款跨平台的Java 3D图形引擎,目前支持PC(J2SE)及Android环境运行(已有iPhone版规划)。该引擎在易用性和运行性能上皆有出色的表现,支持常见的游戏开发功能,诸如精灵动画,音频处理和视频播放等。

最低运行环境要求为Android 1.6。

项目地址:http://code.google.com/p/catcake/