[JQuery]使用 jQuery,第 2 部分: 构建未来的 Web 应用程序

mikel阅读(671)

简介

这 6 个月以来,JQuery 受欢迎的指数迅速攀升,现已成为 Web 开发人员首选的 JavaScript 库。与此同时,人们对富 Internet 应用程序(Rich Internet Application,RIA)的应用和需求也在迅速增长,并期待用基于浏览器的应用程序代替桌面应用程序。无论是电子表格,还是薪水册和电子邮件应用 程序,现在都在浏览器中再现了类似于桌面的体验。随着这些应用程序数量的增多和功能的日益复杂,JavaScript 库将会变得越来越重要,因为它是构建这些应用程序的坚实基础。JQuery 将成为开发人员最佳选择。本系列文章深入探索了 jQuery,并提供了坚实的基础。开发人员借助这个基础就可以快速轻松地构建自己的 RIA。

上一篇文章 中,您了解了 jQuery 的基础知识,包括如何在开发环境中设置 jQuery,以及它的核心函数是如何工作的。您看到了 jQuery 如何通过选择和过滤方法来简化搜索和查找页面元素,以及如何才能找到所需的元素。接下来,您还体验了 jQuery 提供的遍历搜索结果的各种方法,而且其中的很多函数与您在其他编程语言中接触到的函数十分相似。最后,还介绍了一个示例小部件,即 Select All/Deselect All 复选框,并看到了 jQuery 如何通过几行代码来构建这个小部件。

在本篇本章,通过 更精彩的功能来进一步扩展您的 jQuery 知识,并向老的 Internet 应用程序添加一些真正的 “富” 特性,使这个演示应用程序成为富 Internet 应用程序。我先向您展示 jQuery 如何处理事件。所谓事件就是指鼠标单击、突出显示和拖动等。请注意,事件处理并不局限于按钮,还包括处理在任何 div、span 等上进行的鼠标单击。接下来,我将讨论如何获取和设置 Web 页面内的对象的属性。这包括如何从表单元素获得文本、如何从 div 获得 innerHTML,以及如何确定哪个类附加到哪个元素上。最后,我将讨论如何在无需重新加载页面或调整外部样式表的情况下修改页面元素的 CSS 属性。

示例应用程序在这个 Web 邮件应用程序的额外小部件中包含了各种东西,展示了如何创建一个客户端的富应用程序,并且根据与页面的交互来更改对象的颜色、大小和位置。(这些交互只限 于客户端 — 下一篇文章将会添加服务器端的交互)。通过本文,您将能够掌握创建 RIA 所需的 jQuery 工具,并借此打动您的客户。

事件

jQuery 内的 Events 模块是向 Web 应用程序添加交互性的第一步,因为事件通常是页面上发生的事情的触发器。正如我在简介中提到的,您不应该认为事件只发生在 Form 元素 — 实际上,任何元素都能触发事件,因此应该充分利用这一点来更轻松地构建定制的小部件,以及添加一些独特却又不局限于特定 Form 元素的交互。

众所周知,大多数事件 基于 Form 元素。演示这些方法最好的方式就是使用它们。在开始深入研究可用的函数之前,一定要注意:Events 模块针对每个函数都遵循一种模式。每个事件函数都包含两种形式:一个没有任何参数,一个包含一个函数作为参数。二者间的差异十分重要,而且这对各个函数都 是一致的。没有参数的函数将实际激发该事件。换而言之,调用 click() 将实际导致该按钮被单击。在实际单击该按钮,或其 click() 函数被调用时,将会调用 click(function)。是不是很困惑?这只是文字上的描述,举例说明之后,您就会清楚了。

清单 1. jQuery Event 方法

// make the "myButton" click.  This will cause the button to click and any actions
// tied to it will occur - for example, it could submit a form, or other
// jQuery actions could be tied to it.
$("#myButton").click();
// use jQuery to setup what will actually happen when the "myButton" is
// actually clicked.
$("#myButton").click(function(){
$("#myDiv").toggle();
});
// A common pattern in jQuery when setting up actions on a page is to trigger the
// action to occur initially when the page is loaded.  This occurs frequently
// with AJAX setups, where the values come from the server.
// In this example, the myDiv has its visibility toggled every button click.  When
// the page is loaded, we call click() immediately, which toggles the view
// as soon as the page views (not a practical example, but you should see the design)
$("#myButton").click(function(){
$("#myDiv").toggle();
}).click();

如下所列的事件 符合我在之前所介绍的设计模式,而且也都具有与其相关联的两个函数。为了简单起见,我只列举了第一个:

  • blur() – 在 Form 元素失去焦点时调用,例如,用 tab 键移出具有焦点的文本字段
  • change() – 在 Form 元素失去焦点,并且其值因获得焦点而更改时调用。Internet Explorer 和 Firefox 对此的处理稍微不同。
  • click() – 当在页面元素(不一定是 Form 元素)上单击时调用
  • dblclick() – 当在页面元素(不一定是 Form 元素)上双击时调用
  • error() – 当元素出现内部错误时调用,不同的浏览器对此的处理不同,可能很多人都亲自体验过
  • focus() – 当某个 Form 元素获得焦点时调用
  • keydown() – 当页面元素在其上/内发生一个 keypress 时调用
  • keyup() – 当页面元素在其上/内释放一个 keypress 时调用
  • keypress() – 当相同的页面元素相继发生 keydown 和 keypress 时调用
  • select() – 文本在文本字段内被选中时调用,而不是内容在组合框内被选中时(这时发生的是更改事件)调用。
  • submit() – 提交 Form 时调用

还有一些函数不遵守上文概括的模式,而且也只包含一个可调用的函数。我将这些例外也列于此,但它们不常用:

  • resize(fn) – 对象调整大小时调用
  • scroll(fn) – iframe 卷起时调用
  • load(fn)/unload(fn) – 对象在页面上加载/重载时发生

此 外,您可以想像得到,一些事件是与鼠标紧密相连的。由于这些事件常被误用,所以我将它们包括在第三节。认识到这一点后,jQuery 已经用特定的函数替代了其中的一些事件。我将它们列于此,只是为了直接与底层的 DOM 事件相匹配,但对于所有的实际使用,最好使用其他的方法。比如,当鼠标在某个元素上按下或释放时,就会调用 mousedown(fn)mouseup(fn) 方法。然而,更多时候,却应该调用 click() 方法,因为此方法也会作为事件抛出,而且它更符合预期的行为,更不容易出错。试想一下这样的情况:用户在某个按钮上按下鼠标,发现错了,立即松开鼠标而不是释放鼠标。如果用户用所定义的 mouseup(fn) 在另一个页面元素之上释放鼠标,那么应该发生什么行为呢?理想情况下,这两个函数的使用应该限于对界面的拖放,因为这种情况下单击不会有合适的替代。

Event 模块的最后两个方法 mouSEOver(fn)mouSEOut(fn) 目前在很多 Web 站点上都很常见。它们常被用来显示悬浮帮助、图片显示所需的相框和基于鼠标指针所在位置而发生的颜色改变。JQuery 认识到这两个函数还将很常用,但很多人都不能正确使用它们,这就导致很多错误。人们并不是有意要将 bug 引入其代码,而是自己不会编写嵌套组件或应对其他复杂情况的代码。因此,jQuery 向 Event 模块添加了一个新方法来替代这两个函数,这个方法就是 hover(fn1, fn2) 函数。

清单 2. jQuery 的 Hover 方法

// This demonstrates the hover() function as implemented by jQuery.  You define two
// functions:  what happens when the mouse moves over the specified element
// and what happens when the mouse moves off the element.
// In this example, each row in a table will get a red background when
// the mouse moves over it and a white background when the mouse leaves.
$("tr").hover(function(){
$(this).css("background","#0000ff");
},
function(){
$(this).css("background","#ffffff");
});

属性

页 面交互性的一个体现就是它从页面的某个区域获得信息并将信息传送到其他位置的能力。这可以很具体,比如从一个文本字段获得信息后将信息放入一个表内;也可 以很宽泛,比如从一个组合框获得信息后将信息传给服务器,然后将服务器的响应再放入另外一个不同的组合框内。交互性的核心就是页面信息的传递。

在 页面上保存信息有很多不同的方式,在页面的某个元素内存储信息的方法就更多样了。您可能会想,一个简单的 <p> 所包含的信息肯定没有一个文本字段那么多(这不一定正确),因而,访问信息也有很多不同的函数。同样地,您自己可能已经有了这样的结论:如果能从页面元素 获得信息,那么也应该可以在这些元素上放置信息。实际上,每个页面元素都是一个数据对象,其中包含由 getter/setter 方法封装的变量。JavaBean 模型和 jQuery 的实际差异是方法名称和某些元素不适合特定函数的限制。

在深入研究这些方法之前,让我们先来看看什么信息 存储到页面元素内。简单一些的,像 a <p>,可能只包含 CLASS 或 ID 信息。而像 <img> 则可能包含更多信息,比如 “src”、“alt”、“width” 和 “height”。而复杂一些的,像 < input type="password"> 则可能包含 “defaultValue”、“maxLength”、“readOnly” 或 “accessKey” 等信息。

这种潜在变量的多样性促使 jQuery 创建了一种广义函数来访问它们。这个函数是 attr(name),可用来访问来自任何页面元素的信息。我们将通过几个示例来了解其工作原理。

清单 3. jQuery attr() 函数

<img src="/images/space.gif" id="spacer" class="a b c" alt="blank">
// Calls to the attr() function will return the following
$("#spacer").attr("src"); // will return "/images/space.gif"
$("#spacer").attr("alt"); // will return "blank"
// Similarly, you can access the ID in the same way
$(img).each(function(){
$(this).attr("id"); // will return "spacer"
});

在试图向页面添加交互性时,此函数十分有用。实际上,在添加 data() 函数(如下所示)之前,通常都必须将所需信息压缩到一个可用变量内。例如,假设有一个页面具有两个框架,第一个框架显示选项卡,底部框架显示每个选项卡的内容,那么可以这样设置:

清单 4. 应用 attr()

<!-- This would appear in the top frame as a tab.  The CSS file would control how
the tab appears, and the only HTML code needed would be this -->
<td>
<div class="tab" id="/messages.jsp">Messages</div>
</td>
// This code would appear in the jQuery section.  Notice how we get the ID from the tab,
// and use that information to set the bottom frame, named 'content' with the content
// on the page "messages.jsp"
$(".tab").click( function() {
window.parent.frames['content'].location = $(this).attr("id");
});

除了获得 每个元素上的属性值外,还可以设置 这些值。其效果与以编程方式更改元素外观或行为相同。

清单 5. 利用 attr(str) 更改属性

// will change the image source, and the image displayed on the page will change
$("img").attr("src", "myimage.jpg");
// will change all the links on the page to go to one specific page
$("a").attr("href", "mypage.html");
// will change the maxLength on all password fields to 10 characters
$(":password").attr("maxLength", "10");

页面上的 Form 元素具有一个特殊的函数,该函数可以针对这些元素调用以获得附加到元素的值。在处理表单和验证时,这一点尤其便利,而且在用 Form 元素创建交互 Web 站点时更有可能会用到这些函数。

清单 6. Form 元素的 val() 函数

// will get the text contained in the text field and check that it's not blank
$(":textfield").each(function(){
// use the val() function to get the text inside the textfield
if ($(this).val() == "")
$(this).next().text("Error");
});
// on a new password page, this will compare the new one with the confirmation,
// to make sure they are equal
if ($("#newPassword").val() != $("#confirmPass").val())
$("#newPassword").next().text("Error");

还有其他一些函数,可用来获得包含在某些标记之内的信息。那么这有什么用途呢?比如说,您可以获得包含在某个 <td> 标记内的所有信息并进行替换,或者您也可以将所有 <p> 内的文本变成小写的。获得这些信息的方式有两种,但不能为此使用 attr() 函数。与所有其他的属性函数类似,这些函数也有相应的 setter 方法。第一个是 html() 函数,它能返回某个标记的所有 innerHTML。另一个是 text(),它能返回某个标记内的所有文本。那么二者有何区别呢?html() 函数能返回包括 HTML 标记在内的文本,而 text() 则会分离二者,只返回内含的文本。以下示例展示了它们的不同之处。

清单 7. html() 与 text() 的对比

// this will examine every <td> tag, and if the value is blank, it will insert
// a "-" into it, as a placeholder.
$("td").each(function(){
// check the text of the table cell
if ($(this).text() == "")
$(this).text("-");
});
// this will convert every paragraph's text to lowercase
$("p").each(function(){
var oldText = $(this).text();
var newText = oldText.toLowerCase();
$(this).text(newText);
});
<-- This shows the difference between text() and html() -->
<div id="sample"><b>This is the example</b></div>
$("#sample").html(); // will return "<b>This is the example</b>"
$("#sample").text(); // will return "This is an example"

此外,最近还向 jQuery 库添加了用于属性的 data() 函数。它源自 jQuery UI 项目并且已纳入 jQuery 的整体项目之中。起初,UI 项目开发人员只是觉得他们不想破坏某些页面元素的可用属性,于是就想到要找到一种方法,用来根据自己的需要创建能存储信息的属性。回顾上文提到过的选项卡 的例子。我其实 “破坏” 了此 DIV 的 ID 内的链接,而这显然不是最理想的方法。但是,受 jQuery 以前版本的限制,这在当时是惟一的选择。有了 data() 函数之后,这个问题就有了更好的解决方案。不妨将 data() 函数视为用来访问包含在每个页面元素的内部 Map 的一种方式。一个 Map 实际上就是键-值对的集合。这就让开发人员可以创建他们想要给页面元素提供的任何定制属性,并能给该属性附加任意值。最终的结果就是代码的编写更简单,而 且当项目规模不断增大时,代码的维护也更容易。接下来,让我们用新的 data() 函数重写上文提到的示例:

清单 8. 新的 data() 函数

// create the div like we did above, but without any specific information.  In this
// way we can create a generic HTML layout and customize it in our jQuery code.
<td>
<div class="tab"></div>
</td>
// Now customize each tab in the jQuery code.
$(".tab").eq(0).text("Messages");
$(".tab").eq(0).data("link", "messages.jsp");
$(".tab").click(function(){
window.parent.frames['content'].location = $(this).data("link");
});
// Taking this a step further, you can picture all this information coming from
// an external properties file via a Java array.  This would be the code on a JSP
// page.
<%
// array containing tab names
String[] tabNames;
// array containing tab links
String[] links;
for (int i=0; i<tabNames.length; i++) {
%>
$(".tab").eq(<%=i%>).text("<%=tabNames[i]%>");
$(".tab").eq(<%=i%>).data("link", "<%=links[i] %>");
<% } %>
$(".tab").click(function(){
window.parent.frames['content'].location = $(this).data("link");
});

CSS 处理

本 文最后的这个部分将要介绍如何在不调整样式表或重载此页面的情况下动态地处理页面的 CSS。我们将能够通过简单更改颜色、字体等向页面添加一些基本效果。jQuery 的 CSS 实际上是整个库最初的创意来源。其目标是让页面上的 CSS 编程更容易。正如您所见,此项目随后得到了充分的发展。但是项目的初衷并没有改变,jQuery 的确简化了 CSS 编程。不过,我还是先要说明一点,即 jQuery 为处理 CSS 所提供的那些传统函数实际上已经不能适应当今的 Web 环境。然后,我会介绍可以使用的其他函数(也是 jQuery 内的)。

有两个基本函数可用来处理页面上的 CSS。可以先以字符串传递单个属性,然后再以字符串传递单个值,也可以用字符串/字符串数组的形式一次传递。这两个函数的功能基本相同,并且可以很容易地更改页面的 CSS。

清单 9. css() 函数

// change the background of every div to red
$("div").css("backgroundColor", "#ff0000");
// - or -
$("div").css("backgroundColor", "red");
// - or -
$("div").css({backgroundColor: "#ff0000"}); // notice the braces and lack of quotes

可以看出这些函数非常简单直观,很容易理解和掌握。不过,考虑到目前 Web 页面设计的潮流,这些函数还存在一些问题。常规的 Web 页面都是从页面删除样式,然后在样式表中填入一个外部文件或代码片段。如果能采用其他办法,您肯定 希望将样式代码放入 JavaScript 代码中。否则,将来更改站点的外观将十分困难。

幸运的是,现在已经有了替代函数,它既能提供所需的代码分离,又能让 CSS 处理简单直观。这些函数允许从页面元素添加和删除类。通过将这些类的样式放入外部样式表,就能分离样式、数据和事件,这种分离对于复杂的页面至关重要。请看以下这些示例:

清单 10. 更佳的 CSS 处理 – addClass() 和 removeClass()

// will add the "input_error" class to any form elements that fail to validate
// you can picture the "input_error" class in the external CSS file defining
// a red border and red text
$(":textfield").each(function(){
if ($(this).val() == "")
{
$(this).next().text("Error");
// this will turn the text field's border/text red
$(this).addClass("input_error");
}
// this tests if the text field has the class attached already
else if ($(this).hasClass("input_error"))
{
$(this).next().text("");
// this will remove the class, restoring a normal border/text
$(this).removeClass("input_error");
}
});

如这个示例所示,通过引用在外部样式表内定义的类来调整 CSS 是一种更可取的处理 CSS 的方法。它让 Web 站点创建者通过更改样式表就能改变整个站点 错误消息的处理方式,而不再像采用 css() 方法时那样,必须追究代码的每个实例。虽然这些方法直观易用,但是不太适合大型 Web 应用程序,应该避免采用 addClass()removeClass() 方法。

综合学到的知识

要 综合使用以上知识,让我们再来看看这个示例应用程序。它是一个具有交互性的 Web 应用程序,试图创建一个 RIA 并给用户这样的感觉:他们处理电子邮件所用的这个 Web 应用程序非常类似于桌面应用程序。在本例中,将利用 Event、Attribute 和 CSS 模块来定义 Web 邮件应用程序将如何处理鼠标单击和双击。以下所示的屏幕截图显示了真实的效果。当用户在表的一个行上单击时,此行将会改变颜色以突出显示用户的当前选择。 当用户在消息上双击时,用户就能看到消息,但如果用户读的是条新消息,此行的背景颜色会改变以表明此消息不再是未读消息。

图 1. 在某行上单击
在某行上单击
图 2. 在某行上双击
在某行上双击
清单 11. 综合学到的知识

// First we add the rows to the table.  Each row is a member of the "messageRow" class.
//  We also give an ID to each row, and this ID is the message number itself, which is
// gotten from the Java data object. Keep in mind this sits in a for loop in a JSP file.
<%
for (int i=0; i<messages.size(); i++)
{
MessageData message = messages.get(i);
%>
<tr class="messageRow" id="<%=message.id %>">
// Now that the table has been laid out, we can define our jQuery code to capture single
// mouse clicks and double mouse clicks.
// Notice how we capture a single click on the table row with the click() function.  Next
// notice how we use addClass() and removeClass() instead of manipulating the CSS
// directly with a css() function.  This lets us change the stylesheet underneath
// the code without modifying our jQuery code.
$(".messageRow").click(function() {
$(".messageRow").removeClass("message_selected");
$(this).addClass("message_selected");
});
// Now we capture the double click on a table row.  Ignore the AJAX methods with the
// post() function, which we'll get to in the next article.
// We use the dblclick() function here to capture double clicks.
// Notice in the AJAX call, how we get the ID out of the table row that was double
// clicked.
// We pass this ID to the server in order to get the information about the message back
// from the server.  We defined the message number in the JSP code, so that the ID
// contained the message number.
$(".messageRow").dblclick(function() {
if ($(this).hasClass("mail_unread"))
{
$(this).removeClass("mail_unread");
}
$.post("<%=HtmlServlet.READ_MESSAGE%>.do",
{
messageId: $(this).attr("id"),
view: "<%=view %>"},
function(data){
// Do AJAX stuff here
});
});
});

结束语

随 着应用程序不断从桌面向浏览器转移,像 jQuery 这样的 JavaScript 库的将越来越重要。应用程序会越来越复杂,这就使跨浏览器的 jQuery 成为所有 Web 应用项目的必要工具。由于易于使用和功能完备,jQuery 逐渐从其他 JavaScript 库中脱颖而出,成为很多开发人员的最佳选择。

通过这个 jQuery 系列的第二篇文章,您实际体会到了 Web 页面上的交互、了解如何在客户端实现基本交互(无需从服务器获得信息),并借此扩展了自己的 jQuery 知识。您先是接触了 Event 模块,该模块定义页面元素如何响应各种交互,其中包括鼠标交互、键盘交互和焦点交互。事件是 Web 页面上的交互的最主要的驱动器,而且它们不必附加于 Form 元素。我随后讨论了属性以及如何恰当地从页面元素获得属性,如何在页面元素上设置属性。您看到了通用的 attr() 函数可用于每个元素,并且 Form 元素有获得其值的特殊函数。您还看到了新添加到 jQuery 的 data() 函数,此函数可充当每个页面元素的 HashMap,让程序员可以创建所需的任何属性。最后,您了解到如何修改页面元素的 CSS,而不需重新加载页面。您还体验了 css() 函数的简单和直观。但是为了分离页面的样式和 jQuery 代码,您和您的团队最好选择用 addClass()removeClass() 函数替代前面那些函数。

本 文的最后的一部分将您所学到的这三个模块综合起来,展示了示例邮件应用程序如何处理鼠标交互。通过突出显示单击的行以及在适当的时候对消息进行 “未读” 标记,可以区分鼠标单击和双击,然后为特定于消息的数据向服务器发送一个 Ajax 调用,将消息编号传递给服务器。

在本系列的下一篇文章中,我们将要深入研究 jQuery 内的 Ajax 函数,了解它如何消除处理 Ajax 所涉及到的大量复杂特性,而使其简单到像通常那样只需调用 JavaScript 函数。此外,我们还会谈到 jQuery 内的 Effects 模块,对于为用户创建额外的交互和视觉效果,这十分有用。下一篇文章中的最后部分将会总结整个演示邮件应用程序和我们的 jQuery 课程。到那时,希望您能自信地将这个库添加到自己的 Web 应用程序中。


回页首

下载

描述 名字 大小 下载方法
包含示例应用程序的 Zip 文件 jquery.zip 68KB HTTP
包含示例应用程序的 War 文件 jquery.war 68KB HTTP
关于下载方法的信息

参考资料

学习

讨论

关于作者

 

在 Michael Abernethy 的 10 年技术生涯中,他与各种不同的技术和客户机打交道。他目前是一家拍卖软件公司 Optimal Auctions 的产品开发经理。他现在专注于富 Internet 应用程序,试图同时实现应用程序的复杂性和简单性。他在空闲时常常带上自己最喜欢的书去墨西哥湾海滩度假。

[MVC]Asp.Net Mvc Beta新特性之自动绑定(1)-体验篇

mikel阅读(742)

   我们知道,ASP.NET Mvc Preview5中加入了全新的ModelBinder特性,虽然这个特性非常的强大,但是使用起来并不是那么的友好,因此,在最新的ASP.NET Mvc Beta,框架对这部分进行了进一步的加强,使得复杂参数的自动绑定得以实现,本文将分级部分完整探讨整个mvc框架中的modelbinder实现和完全挖掘系统自带的ModelBinder的能力,使得基于mvc框架的web开发脱离页面取值的苦海.

(参见: http://www.cnblogs.com/leven/archive/2008/08/31/1280481.html以及http://www.cnblogs.com/leven/archive/2008/09/01/1280862.html)

         首先我们稍微回顾下ModelBinder的使用方法.首先定义一个实体类,然后针对该类写一个ModelBinder,确定绑定关系,这样就可以在action的参数中直接使用了.

         然而,很多朋友都有体会,这个ModelBinder用起来太过复杂.有没有更好的解决方法呢?ASP.NET Mvc beta,这个答案是肯定的.那就是beta中提供的新特性,自动绑定.

         我们知道,preview5,系统也能对基本类型以及DateTimeNullable<DateTime>进行自动绑定,但是对于自定义类是无能为力的.但是想一想,自定义实体类也应该是由一系列简单类型构成的啊,也就是说,一个复杂的实体类都是有很多简单类型构成,是不是可以有一个通用的方法来做这个绑定呢?答案是肯定的,其实在我上篇关于preview5绑定的文章例子中就是提供一个相对简单的通用绑定方案,理所当然的,我们可以扩展这个方案,让它更加智能化一些,想来ASP.NET MVC开发团队也意识到这一点,于是在最新的beta版中,mvc框架就增强了DefaultModelBinder的功能,使得绑定工作尽可能的简化.

         在本篇文章中,我们会探讨新的ModelBinder如何使用,且它是如何工作的.

         首先,我们用最快的方式进行一次新版”ModelBinder的实践,建立一个Mvc工程.设定一个默认的routing.然后开始加入代码,这个实践的项目文件如下图:

工程监理完毕后,我们在NewModelBinderDemo.Library.Entities中加入一个SimpleArticle.cs.这是测试的一个简单实体,代码如下:

这是一个没有加任何修饰的简单实体.

然后修改BinderController,加入Action,先看看Controller中的全部代码:

然后是3aspx页面.我们看看关键的simpletest.aspx



这部分代码要注意下,标题和正文的表单命名,article.titlearticle.content,这是不是有什么规则了?暂时先不说明.有兴趣的朋友可以拿demo研究研究,接下来的部分我们会慢慢研究这儿这样命名的原因.

至于其他页面就不再详细说明其中的代码了,感兴趣的朋友可以下载附带的demo自行查看.完成上面的一切后,我们怀着有点忐忑的心情按下Crtl+F5….一步步进行:


Ok.这个页面没问题不过要是这儿也有问题,就说明mvc白学了,

点击下->

这儿也能进来不过好像这都不是关键.赶紧填点东西..

按下提交数据查看结果:

上天作证,我啥事都没做,居然获取到article….太激动了.这意味着我们在mvc框架下开发基本上可以告别繁琐的页面参数获取了,想想p5中让人无法忍受的modelbinder,beta中的是多么的和蔼可请啊.

先别急着兴奋,表单可不止文本域,而且传递的参数可不是只有字符串.这是肯定的,那么我们试试继续考验下DefaultModelBinder..

添加第二个实体. SimpleArticle,具体代码如下:

然后对应添加名为AdvanceTestAdvanceTestResultaction,代码如下:

对应添加advancetest.aspxadvancetestresult.aspx,样式和先前一致,此处就不再浪费地方了.

然后我们继续测试

填入合适的数据,提交..


非常的神奇
,我们仍然什么都没做,系统的ModelBinder已经完全识别了AdvanceArticle类并对其下的各种类型的属性赋值.不过,有的朋友可能担心了,我们刚才的表单中可是有时间和数字类型,如果用户不按常理出牌,添了个错误的信息,是否会出错了?我们可以试试:

继续提交查看结果:

看上去没啥问题啊,系统对错误的数据采取了使用默认值的方式.但是如果系统给出的默认值和我们需要的不同怎么办呢?比如这儿的提交时间显然是不行的.当时是有办法的,事实上我们只需要在实体的构造方法中对这些属性设定个初始值就万事大吉了,系统的ModelBinder发现数据无法填充进去自然会保持原样.

比如修改下AdvanceArticle:

这样之后我们再次提交刚才的表单,结果变化如下:

不错,自动变成了我们设定的初始值了.该问题解决..

         继续想想,好像目前为止我们都是取的web表单中的文本,其他的表单该怎么取呢?我们继续对其他常用表单进行一次测试,为了方便,我们直接修改了AdvanceArticle类来进行测试,修改后的类如下:

这儿自定义了一个enum类型来代表状态:

我们继续测试DefaultModelBinder的智商….

填写表单:

提交查看:

让人感觉十分惊讶的是,系统居然全部认出了并成功绑定了数据.接下来我们看看更高级的特性,自动绑定数组以及包含类,继续修改AdvanceArticle:

继续测试:

提交查看结果非常棒,系统认出了所有的表单信息并成功绑定.

本文到此相信大家都对系统的自动参数绑定的威力有了一定的了解吧,相信看到如此强大的能力之后你也想将手上的项目升级的ASP.NET MVC Beta上来脱离取值的苦海吧.

         在下一篇中,我们将详细研究系统这个威力强大的ModelBinder的实现原理,以及对默认绑定的细调设置,更深层次了解目前mvc框架中的参数绑定特性,最后附上演示Demo的全部源代码.
By Leven
2008-10-18
http://files.cnblogs.com/leven/NewModelBinderDemo.rar

[Flex]Flex开源项目集合

mikel阅读(849)

一些不错的开源Flex项目

 

********************************************************************************************

Flex开源项目

********************************************************************************************

1. Flexbox

http://flexbox.mrinalwadhwa.com/

这是一位来自印度的flex开发者在07年2月份建立的flex组件库,里面也有不少好东西。

 

2. Flexlib

http://code.google.com/p/flexlib/

由Dougmccune等人建立的flex组件库,其中有不少实用的组件。

 

3.SpringGraph Flex Component

http://mark-shepherd.com/blog/springgraph-flex-component/

非常酷的拓扑关系组件!

 

4.Flex Visual Graph Library

http://code.google.com/p/flexvizgraphlib/

又一个拓扑图形展示的类库,动态效果那叫“惊艳”!

该项目的讨论组:

http://groups.google.com/group/flexvizgraphlib

 

5. Open Source Framework for Flex / Flash & AIR(Apollo)

http://code.google.com/p/advancedflex/

The Advanced Flex project is open source Libraries & Framework for Adobe Flex & Flash developer. This is the framework written in AS3.0 & MXML for Flex & Flash & AIR(Apollo).看起来里面涉及到了AOP及Debugger等内容,有时间要好好看看了。

 

6. Open Source Flex Component: TreeMap

http://www.zeuslabs.us/2007/11/14/open-source-flex-component-treemap/

 

7. FlexMDI

http://code.google.com/p/flexmdi/

主要解决多窗口应用生成的问题,全名叫做:Flex Multiple Document Intece ,效果很不错,对于做基于窗口的应用来说是个好的起点。

 

8. 反射组件类reflexutil

http://code.google.com/p/reflexutil/

这是作者的博客:

http://blog.deconcept.com/

 

9. 对象处理器flex-object-handles

http://code.google.com/p/flex-object-handles/

作者对该组件的介绍:

http://rogue-development.com/objectHandles.xml

WIKI:

http://code.google.com/p/flex-object-handles/wiki/ObjectHandlesUsage

功能是很强大,不过要想自己使用,还需修改一番!

 

10.CheckboxTree和Carousel组件

http://giles.roadnight.name/components.cfm

都有演示和源码!

 

11.Flex拖拽库

http://code.google.com/p/flex-drag-n-drop-lib/

新鲜出炉的类库,太棒了,以后做拖拽处理就方便多了!

 

12. birdeyehttp://code.google.com/p/birdeye/该项目是一个比较庞大的项目涉及数据可视化的多个方面:

关系分析展示:

Relational Analysis ([/b]RaVis)[/b]

空间信息分析展示:

GeoSpatial Analysis (GeoVis)[/b]

数值分析展示:

Quantitative Analysis (QaVis)

[/b]历史数据分析

Temporal Analysis (TaVis)

[/b]变形类库:

General Utility (GuVis)[/b]

 

13.antennae

http://code.google.com/p/antennae/

基于ant的Flex工程编译模版,内置FlexUnit等测试工具,很强大的说。

 

14.Degrafa:声明式的图形描述框架

官方网站

http://www.degrafa.com/

googlecode:

http://code.google.com/p/degrafa/

演示:

http://samples.degrafa.com/

个人还是喜欢用AS3和flashIDE来绘图,不太喜欢这个东西。不过这可框架有专门的组织来推动,似乎前景不错!

 

15.openflux

号称是 an open-source Flex component framework which allows developers to create radically new and custom Flex components,似乎是基于下一代Flex组件标准,但是目前还没看到更多的东西。只有这个:

http://www.bobjim.com/2008/04/04/updated-plexiglass-openflux-3d-example/

该项目的GoogleCode:

http://code.google.com/p/openflux/16.FlexReport

http://code.google.com/p/flexreport/

作者博客:

http://www.kemelyon.com/bts/

一个开源的客户端报表生成组件,目前唯一不足的是不能消除字体的锯齿问题,不过只要不放大字体,应该没问题

 

 

********************************************************************************************

AS3开源项目

********************************************************************************************

 

1.Flex/Actionscript Math Library

http://code.google.com/p/as3mathlib/

The Flex/Actionscript Math Library (as3mathlib) is intended to provide a rudimentary numerical analysis toolkit for the Actionscript/Flex programming environment.一个很不错的基础项目,不过看起来还没有完成:This library has just been converted from Actionscript 2 to Actionscript 3. It is not ready for general use.

 

2.ActionScript 3.0 library for several basic utilities

http://code.google.com/p/as3corelib/

AS3核心类库,里面有包括加密、图形文件编码等等类库。

 

3.alivepdf

http://code.google.com/p/alivepdf/

是一个Open-source AS3 PDF library,目的在于将flash内容转为pdf文件信息,通过后台程序来生成pdf文件。

 

4.Tweener

http://code.google.com/p/tweener/

A class for creating tweens in actionscript 2 and 3 – because there’s infinity between 0 and 1.

 

5.ActionScript 3 libraries for interactive visualizations on the web

http://flare.prefuse.org/

刚(10.22.2007)发布的数据可视化工具包,目前alpha版,不过有不少亮点了,很有希望。

 

 

6.Dependency injection / Inversion of control container for ActionScript 3, Flash 9, and Flex 2

http://code.google.com/p/di-as3/

 

7.as3ds

http://code.google.com/p/as3ds/

AS3 Data Structures For Game Developers以前记得这个好像是收费的,现在看起来没限制的使用了。

 

 

8.Pulse粒子系统作者对该系统的介绍:

http://www.rogue-development.com/pulseParticles.htmlGoogle code:

http://code.google.com/p/pulse-particle/演示地址:

http://rogue-development.com/pulse/explorer/

 

 

9.AS3 GIF Player Class

http://www.bytearray.org/?p=95

GoogleCode:

http://code.google.com/p/as3gif/

 

10.AS3的物理引擎(ActionScript 3 Physics Engines)

http://henryjones.us/articles/actionscript-3-physics-engines

 

 

11. 数据可视化类库Prefuse

http://flare.prefuse.org/

the flare visualization toolkit:ActionScript 3 libraries for interactive visualizations on the web.

 

 

12.文档解析类库:vanrijkom-flashlibs

http://code.google.com/p/vanrijkom-flashlibs/其中最有用的可能是地图文件和3D文件的解析类库了!

 

13.MinimalComps: Minimal AS3 UI Component Set

http://www.bit-101.com/blog/?p=1126

 

 

14.GoogleMap Flash Intece

http://code.google.com/p/google-maps-flash-intece/

可惜的是written in ActionScript 2,不过应该有借鉴意义。

 

 

15.ScaleBitmap : 9-slice bitmap class

http://www.bytearray.org/?p=118

一个缩放位图的类,很有用!

 

16.开源AS3即时通讯类库XIFF

http://www.igniterealtime.org/projects/xiff/

 

17.另一粒子系统Flint Particle system

http://flintparticles.org/

 

 

******************************************************************************

AS3 3D项目

********************************************************************************************

 

1. PV3D虽然该项目发布不长时间,但是它已经名声远扬了,遗憾的是这段时间它的官方博客不能访问了,只能访问它其他网站

Google code

http://code.google.com/p/vision3d/

Wiki

http://wiki.vision3d.org/

John Grden

http://www.rockonflash.com/blog/

 

2. away3D:官方网站

http://www.away3d.com/google code:

http://code.google.com/p/away3d/同pv3d一样,是基于actionscript 3的flash3D引擎:

Away3D is a realtime 3d engine for flash in actionscript 3, originally derived from Papervision3D

 

************************************************************************************

与JS相关类库

************************************************************************************

 

1.SWFAddress

http://www.asual.com/swfaddress/

项目地址:

http://sourceforge.net/projects/swfaddressSWFAddress is a small, but powerful library that provides deep linking for Flash and Ajax. It’s a developer tool, allowing creation of unique virtual URLs that can point to a website section or an application state. SWFAddress enables a number of important capabilities which are missing in today’s rich web technologies该类库解决了swf的难题,深度链接,也是flex3的一个重要特色,值得关注!2. 不可不提的swfobject

http://code.google.com/p/swfobject/

SWFObject is an easy-to-use and standards-friendly method to embed Flash content, which utilizes one small JavaScript file

 

3.HTMLWrapper

http://code.google.com/p/htmlwrapper

Motion & Color Inc. today open-sourced a public beta version of

Wrapper, formerly used for closed-sourced projects. Wrapper is a

cross-browser compliant HTML/CSS rendering engine written in

ActionScript that sits on top of your standards compliant HTML page.

Wrapper eliminates cross-browser issues and makes integrating

ActionScript and HTML/CSS projects possible without needing to

compile. Wrapper will be available free from

 

***********************************************************************************

企业级组件库

********************************************************************************************

 

1.YahooFlex/Flash组件ASTRA GaloreASTRA Galore: New Flash and Flex Components

http://www.yswfblog.com/blog/2008/01/30/astra-galore-new-flash-and-flex-components/

官方的话是这么说的:

Our ASTRA library of components has just been updated with three new Flash components and seven (yeah, we are serious about this) new Flex components, as well as some important updates to the existing ones.Yahoo,真棒!

 

***********************************************************************************

ROR与Flex相关类库

***********************************************************************************

 

1.The Ruby on Rails RIA SDK by Adobe

http://code.google.com/p/rubyonrails-ria-sdk-by-adobe/

 

2. as3Stomp – Project site and source code

http://flexonrails.net/?p=99

该项目在Googlecode地址:

as3-stomp

This library is an actionscript 3 implementation of the Stomp protocol. It enables communication between Flash or Flex and any Stomp broker.It has been primarily designed to work with Apache ActiveMQ.

 

 

*************************************************************************************

测试类库

********************************************************************************************

 

1. 使用FlexUnit

http://www.adobe.com/devnet/flex/articles/unit_testing.html

http://code.google.com/p/as3flexunitlib/2. 可视化Flex单元测试框架visualflexunit:

Announcing Visual FlexUnit – A Visual Testing Extension for FlexUnit该项目的home page在google code。

作者Douglas McCarroll与合作公司Allurent共同建立了这个项目,并开源供大家使用。

 

 

**************************************************************

FlexMap组件

********************************************************************************************

 

1. uMap(免费)

homepage:

http://www.afcomponents.com/components/umap_as3/

demos:

http://ccgi.arutherford.plus.com/website/flex/UMap/UMapFlexDemo/

mouSEOver to to show picture:

http://ccgi.arutherford.plus.com/website/flex/modestmaps/sampleCCTV/

 

2.modesMap(开源)

homepage:

http://modestmaps.com/

demos:

http://modestmaps.com/example.html

http://modestmaps.com /tutorial-actransit /actransit.html

 

 

************************************************************************

Flex 框架类库

********************************************************************************************

 

1、针对Cairngorm的扩展框架:Flexcairngoamhttp://code.google.com/p /flexcairngorm/Adobe官方的cairngorm框架早就被人们诟病,这次这个非官方的补充,看来是个容易让人接受的框架了!

[Adobe]Adobe Creative Suite 4 Production Premium F

mikel阅读(843)


Adobe Creative Suite 4设计开发套装已经登场,诸多新特性让人眼前一亮,但同时也对电脑软硬件配置提出了新的要求。
Adobe CS4分为六个子套装,各自包含不同的程序组件和共享服务,面向不同层次的设计师,因此对系统的具体要求也略有不同,比如Master Collection就是最苛刻的,Web和Deisgn系列则轻松一些。







Adobe® Creative Suite® 4 Production Premium 软件是需要通过广播、在线和设备按时制作出世界级视频、音频和交互式媒体的创意专业人士不可或缺的解决方案。

获取更多详细信息 (美国站点)*

包含组件如下:
After Effects CS4
Adobe Premiere Pro CS4
Photoshop CS4 Extended
Flash CS4 Professional
Illustrator CS4
Soundbooth CS4
Adobe OnLocation CS4*
Encore CS4*
Adobe Bridge CS4
Adobe Device Central CS4
Dynamic Link
 

语言版本本产品提供以下语言版本:

  • 英语
  • 法语
  • 德语
  • 意大利语
  • 日语
  • 朝鲜语 (仅限 Windows)
  • 西班牙语

系统要求Windows

  • DV 需要 2GHz 或更快的处理器; HDV 需要 3.4GHz 处理器; HD 需要双核 2.8GHz 处理器**
  • Microsoft® Windows® XP (带有 Service Pack 2, 推荐 Service Pack 3) 或 Windows Vista® Home Premium、Business、Ultimate 或 Enterprise (带有 Service Pack 1, 通过 32 位 Windows XP 以及 32 位和 64 位 Windows Vista 认证†)
  • 2GB 内存 (运行多个组件时推荐使用更大内存)
  • 16.3GB 可用硬盘空间用于安装; 安装过程中需要额外的可用空间 (无法安装在基于闪存的设备上)
  • 1,280×900 屏幕, OpenGL 2.0 兼容图形卡
  • 某些 GPU 加速功能需要 Shader Model 3.0 图形支持
  • DV 和 HDV 编辑需要专用的 7200 转硬盘驱动器; HD 需要条带磁盘阵列存储 (RAID 0); 首选 SCSI 磁盘子系统
  • SD/HD 工作流程需要经 Adobe 认证的卡以捕获并导出到磁带
  • 需要 OHCI 兼容型 IEEE 1394 端口进行 DV 和 HDV 捕获、导出到磁带并传输到 DV 设备
  • DVD-ROM 驱动器 (创建 DVD 需要 DVD+-R 刻录机)
  • 创建蓝光盘需要蓝光刻录机
  • Microsoft Windows Driver Model 兼容或 ASIO 兼容声卡
  • 使用 QuickTime 功能需要 QuickTime 7.4.5 软件
  • 在线服务需要宽带 Internet 连接‡

Mac OS

  • Intel® 多核处理器
  • Mac OS X 10.4.11 – 10.5.4 版
  • 2GB 内存 (运行多个组件时推荐使用更大内存)
  • 20.6GB 可用硬盘空间用于安装; 安装过程中需要额外的可用空间 (无法安装在使用区分大小写的文件系统的卷或基于闪存的设备上)
  • 1,280×900 屏幕, OpenGL 2.0 兼容图形卡
  • 某些 GPU 加速功能需要 Shader Model 3.0 图形支持
  • DV 和 HDV 编辑需要专用的 7200 转硬盘驱动器; HD 需要条带磁盘阵列存储 (RAID 0); 首选 SCSI 磁盘子系统
  • DVD-ROM 驱动器 (DVD 创建需要 SuperDrive)
  • 创建蓝光盘需要蓝光刻录机
  • Core Audio 兼容声卡
  • 使用 QuickTime 功能需要 QuickTime 7.4.5 软件
  • 在线服务需要宽带 Internet 连接‡

**AMD 系统需要支持 SSE2 的处理器。
Adobe® Photoshop® Extended 本机支持 64 位版本的 Windows Vista。Adobe Premiere® Pro、After Effects®、Soundbooth®、Encore® 和 Adobe OnLocation™ 经过 64 位 Windows Vista 认证。
‡本产品可能允许您访问在线提供的特定功能 (“在线服务”), 前提是高速 Internet 连接可用。可能不提供所有国家/地区、语言和/或货币的在线服务及其特定功能, 它们也可能全部或部分停止, 恕不另行通知。使用在线服务受到单独使用条款和 Adobe 在线隐私策略的约束, 并且使用这些服务可能需要用户进行注册。包括最初免费提供的服务在内的某些在线服务可能会收取额外费用。有关更多详细信息或要查看使用条款及在线隐私策略, 请访问 www.adobe.com/cn/

  种子下载

 http://www.demonoid.com/files/download/HTTP/1655690/4170021

 INSTRUCTIONS
1. Run each (*.exe) file to extract the content
2. Run setup for each. Start in "Production Premium"Adobe CS4"Setup.exe" folder.
3. NO Serial/Keygen/Crack provided. You must wait for those.

4. ENJOY! – Not Yet

 

Adobe CS4改变了激活的策略,取消了电话激活的功能,不联网,CS4不用激活
处理方法就更简单了,在host文件里把activate.adobe.com 屏蔽掉即可

[C#]Db4o for .NET

mikel阅读(1536)

当你想要快速的开发系统原型,用于演示功能、探索需求、消除风险时,用db4o吧;
当你的程序的数据量不算特别大,而又想最快的提高开发速度时,用db4o吧;
当你不想在程序的可配置信息的存储、解析上花费时间时,用db4o吧;
当你不懂SQL也不想学SQL时,用db4o吧。

Db4o是对象数据库,有java和.net两个分支。这里没有SQL,没有表,一切都是原生对象。官方网站对Db4o的描述是:
•完全原生于Java和.NET
•100% 面向对象, 抛开对象-关系映射
•为嵌入式应用优化
•开源,可以基于GPL协议免费使用

Db4o的使用十分简单,以本地数据库为例子:

(1)打开数据库
IObjectContainer ObjectContainer = Db4oFactory.OpenFile("data.yap");
这句话打开本地数据库data.yap,如果该文件不在,则自动创建数据库文件。
(2)关闭数据库
ObjectContainer.Close();
(3)查询对象
IList<YourClass> rlist = ObjectContainer.Query< YourClass >();
这句话查询数据库中全部的YourClass对象。
Db4o提供了多种对象查询方式,详情可见官方文档。
(4)Activate对象
默认从数据库提取的对象只有一定的深度,更深的被引用的对象为null,为了提取更深的对象,需要Activate已提取的对象:
ObjectContainer.Activate(YourObject, depth)
(4)储存/更新对象
ObjectContainer.Store(YourObject)
如果YourObject不是从数据库中通过查询获得的实例,则将YourObject及它所持有的对象,及持有的持有的……所有可达对象全部储存入数据库。
如果 YourObject是从数据库通过查询获得的实例,则更新YourObject的属性。默认不进行级联更新,你也可以设置级联更新,如:
 Db4objects.Db4o.Db4oFactory.Configure().ObjectClass(typeof(YourClass)).CascadeOnUpdate(true);
(5)删除对象
ObjectContainer.Delete(YourObject)

以上是最基本的操作,很快很敏捷。更多的操作可见官方文档。

我现在用最懒惰的方法在用db4o:设置一个Root Object,其它Objects都挂接在Root Object之下,程序启动时就从数据库中把第一个Root实例提取出来,把要用的对象都Activate出来,数据变动时就 Store(ObjectChanged)一下子。

Db4o官方网站http://www.db4o.com/
JackyXu 的博客有数篇关于db4o的笔记:http://www.cnblogs.com/JackyXu/
db4o 中的数据库重构: http://www.ibm.com/developerworks/cn/java/j-db4o3.html

[Flash]Linux下的Flash Player 10

mikel阅读(746)

Linux在Flash播放器领域终于成为了主流的操作系统了,Adobe今天发布了支持Linux的Adobe Flash Player 10,给Linux的多种媒体封装格式带来了极大的方便。在过去Linux在这个领域只能算是二流的成员,得不到Flash播放器的青睐,2007年Linux用户就是在其他主流平台使用Flash 9长达6个月之后,才迎来Linux版本。

   如今,当微软决定将Linux平台Silverlight技术推迟发布之后,Adobe给Linux平台带来了“平等”的播放器,并称“Flash播放 器已经占据了互联网桌面市场98%的份额”,同时,“80%的在线视频均采用Adobe的Flash技术”,而且在9个月之后,Flash9将占据互联网 桌面市场90%的份额。
  Flash Player 10是配合Adobe Creative Suite (CS) 4发布的客户端软件,提供了对Photoshop和Illustrator创建矢量绘图的支持,并支持2D和3D多种特效。
  Adobe反复强调他的“Open Screen Project”,在今年5月份他就提出这个计划,称他们将免费开放的文件格式和API,使得Flash可以在移动设备上和桌面市场一样被广泛使用。
  在Microsoft Silverlight 发布不久, mono小组就开始了linux下的Silverlight实现,名称叫Moonlight,代码olive,也就是在短短的一个月左右的时间,Moonlight已经可以运行。

  GNOME的创始人Miguel deIcaza称,Flash还不能在免费和开源软件社区大出风头,作为一个非盈利的组织,肯定担心Abobe在多媒体获得太多的控制权。他们已经开发了Flash的替代品Gnash,只使用免费授权的软件和编解码器。
  Flash 10 已经发布了支持Linux, Windows, 和 Macintosh平台的版本,支持Solaris的版本将在年底发布。同时Flash10还支持Adobe AIR。
  访问:多个平台的Flash10

[C#]等比例缩放图片

mikel阅读(885)

看到海东兄的按比例缩放图片 ,我就把我写的js版本的也拿出来show一下,哈哈!
js版本:
function resizeImage(obj, MaxW, MaxH)
{
 var imageObject = obj;
    var state = imageObject.readyState;
 if(state!='complete')
 {
        setTimeout("resizeImage("+imageObject+","+MaxW+","+MaxH+")",50);
  return;
    }
    var oldImage = new Image();
    oldImage.src = imageObject.src;
    var dW = oldImage.width;
    var dH = oldImage.height;
    if(dW>MaxW || dH>MaxH)
 {
        a = dW/MaxW; b = dH/MaxH;
        if( b>a ) a = b;
        dW = dW/a; dH = dH/a;
    }
    if(dW > 0 && dH > 0)
 {
        imageObject.width = dW;
  imageObject.height = dH;
 }
}
使用很简单:<img src="../pic.jpg" onload='resizeImage(this,60,90)> 就OK了;
注:等比例放缩的时候会出现抖动的情况,处理方法很简单,你在img的属性先设置它的widht和height,这样的话加载的时候绝对不会超过这个尺寸,等你js运行好之后就会调到你所规定的比例,绝对不会以下撑到很大。

同时也附上C#版本的
C#版本—海东兄 http://www.cnblogs.com/ghd258/archive/2005/11/07/270447.html
1/// <summary>
 2        /// 按比例缩放图片
 3        /// </summary>
 4        /// <param name="imgUrl">图片的路径</param>
 5        /// <param name="imgHeight">图片的高度</param>
 6        /// <param name="imgWidth">图片的宽度</param>
 7        /// <returns></returns>

 8        public static string GetImageSize(string imgUrl,int imgHeight,int imgWidth)
 9        {
10            string fileName = System.Web.HttpContext.Current.Server.MapPath(imgUrl);
11            string strResult = string.Empty;
12            if(System.IO.File.Exists(fileName) && imgHeight != 0 && imgWidth != 0)
13            {
14                decimal desWidth;decimal desHeight;                                            //目标宽高
15                System.Drawing.Image objImage = System.Drawing.Image.FromFile(fileName);
16                decimal radioAct = (decimal)objImage.Width/(decimal)objImage.Height;        //原始图片的宽高比
17                decimal radioLoc = (decimal)imgWidth/(decimal)imgHeight;                    //图片位的宽高比
18                if(radioAct > radioLoc)                                                        //原始图片比图片位宽
19                {        
20                    decimal dcmZoom = (decimal)imgWidth/(decimal)objImage.Width;
21                    desHeight = objImage.Height*dcmZoom;
22                    desWidth = imgWidth;
23                }

24                else
25                {
26                    decimal dcmZoom = (decimal)imgHeight/(decimal)objImage.Height;
27                    desWidth = objImage.Width*dcmZoom;
28                    desHeight = imgHeight;
29                }

30                objImage.Dispose();                //释放资源
31                strResult = "width=\"" + Convert.ToString((int)desWidth) + "\" height=\""
32                    + Convert.ToString((int)desHeight) + "\" ";
33            }

34            return strResult;
35        }

[MVC]ASP.NET MVC Beta版发布

mikel阅读(714)

一大早来看到了一个不好也不坏的消息,经过了漫长的从Preview 1到Preview 5的预览,好的是ASP.NET MVC终于发布Beta版了,坏的是UCenter.NET项目又得进行升级了。这次发布的Beta版本相对于ASP.NET MVC Preview 5来说,变化不是很大,主要包括:

1. 改变验证信息使其对最终用户更加友好

2. 在Controller中添加了Url属性,类型为UrlHelper

3. 重命名CompositeViewEngine为AutoViewEngine

4. 在IViewEngine中新添加了ReleaseView方法

5. 移除了HtmlHelper中的大多数方法,变为HtmlHelper的扩展方法,并且放在了System.Web.Mvc.Html命名空间下

6. 添加了新的HttpVerbs枚举,包含了常用的Http谓词:GET, POST, PUT, Delete, HEAD

7. 从ViewContext中移除了ViewName属性

还有其他的一些变化,就不列举了,大家可以到这里下载ASP.NET MVC Beta版本

官方站点:http://www.codeplex.com/aspnet

[C#]Db4o for .NET 使用心得(1、2):Trace db4o;慎用struct

mikel阅读(825)

Db4o(http://www.db4o.com/)是著名的开源对象数据库,使用它能够将持续层代码量降低到忽略不计的程度。如果数据量不大,用它能够将开发速度提高一个层次。
我手中的小项目需要储存约十万个联系人的数据,考察了SQLite与db4o,最终决定选用db4o. 我使用的是db4o 7.4 for .NET 2.0。关于db4o网上有很多文档,然而有一些问题,在网上不容易找到解决办法,总结一下,写在下面。

(1) Trace db4o

ObjectManager是官方查看db4o数据库的客户端,然而,db4o7.4这个版本对应的ObjectManager不再免费,用不了 了。要弄清楚在程序中db4o数据库到底做了哪些事情,除了ObjectManager外,还可以打开db4o 的日志,进行跟踪。

在打开数据库之前,进行Trace操作的代码如下:

Code

 

这样,在VS的output窗口或者控制台里会有相关的操作日志,如:

[db4o 7.4.60.11658   20081016 07:59:06
 
17563 update Orc.ContactManager.Contact, 联系人管理器
[db4o 
7.4.60.11658   20081016 07:59:06
 
346372 new System.Guid, mscorlib
[db4o 
7.4.60.11658   20081016 07:59:06
 
346415 new Orc.ContactManager.ChannelType, 联系人管理器
[db4o 
7.4.60.11658   20081016 07:59:06
 
17770 update Orc.ContactManager.Contact, 联系人管理器
[db4o 
7.4.60.11658   20081016 07:59:06
 
346571 new System.Guid, mscorlib

 

2 尽量少用struct, enum

目前db4o处理普通struct及enum还不尽如意。
对于普通的struct及enum,db4o不能辨别待储存/更新的实例与数据库中原有实例是否同一实例,因此当update时,即使值没有变 动,db4o也会将它new一个出来,储存入数据库。如果仅仅只是这样,不过浪费了一些无谓的IO操作,更大的问题是它储存进去一个新值,却不删除原有的 值,导致数据库文件中存在大量的垃圾数据。

通过下面小程序就可以验证这一缺陷:

Code

 

程序运行结束后,数据库文件test.yap 大小为2k.

运行日志如下:


[db4o 
7.4.60.11658   20081016 09:42:39]
 
914 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:42:39]
 
914 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:42:39]
 
914 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:42:39]
 
914 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:42:39]
 
914 update Db4oTest.Contact, Db4oTest

可见,每次运行ObjectContainer.Store(c)均对c进行update。

将Contact的代码改为:

Code

 

编译程序,删除test.yap文件,重新运行程序,得到新的test.yap文件大小为144k,可见其中存在大量的垃圾数据。查看日志信息可以发现问题所在:


2352 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:48:56]
 
99639 new System.Guid, mscorlib
[db4o 
7.4.60.11658   20081016 09:48:56]
 
99682 new Db4oTest.ContactType, Db4oTest
[db4o 
7.4.60.11658   20081016 09:48:56]
 
2352 update Db4oTest.Contact, Db4oTest
[db4o 
7.4.60.11658   20081016 09:48:56]
 
99716 new System.Guid, mscorlib
[db4o 
7.4.60.11658   20081016 09:48:56]
 
99759 new Db4oTest.ContactType, Db4oTest

 

可见每update一次Contact c,db4o都要new一个Guid,new 一个ContactType,存入数据库,原有的Guid/ContactType,则变成垃圾,依旧呆在数据库中,导致数据库文件急剧增长。

.net下,Int32也是一种struct,然而,从上例日志中却未发现新建Int32 Code,我猜测是db4o对Int32这些常用struct进行了特殊处理。

为了避免垃圾数据,使用db4o时最好慎用struct。

[Adobe]Adobe发布的Adobe Flash Player10下载

mikel阅读(668)

Adobe Systems周三在毫无征兆的情况下发布了Adobe Flash Player 10软件,版本号10.0.12.36,内置3D处理能力,并支持数种Flash特效。

Flash Player 10是配合Adobe Creative Suite (CS) 4发布的客户端软件,提供了对Photoshop和Illustrator创建矢量绘图的支持。

下载:Adobe Flash Player 10