[转载]Android--自定义GridView/ListView数据源

mikel阅读(1459)

[转载]Android–自定义GridView/ListView数据源 – 莴笋炒肉 – 博客园.

在开发中,我们常常会遇到比较复杂的GridView/ListView的布局,重新实现BaseAdapter不但能帮助我们实现我们想要的布局 效果,并且在绑定大数据量时也不会感觉有卡壳现象。记得以前用一个ListView直接去绑定手机内的联系人Cursor(一百多号人),滑动的时候就会 有卡的感觉。今天决定写个Demo是因为在项目中可能会要实现这样的一个效果:一个GridView中绑定4个ImageButton,有些按钮在特定的情况下是不可用的,也就是Enable=false;并且不同的按钮要拥有各自不同的点击事件

实现第一点好办,添加一个标志位boolean bl来控制按钮的Enable状态,实现第二点就是将View.onClickListener添加到List列表中

1、MyAdapter.java继承自BaseAdapter

public class MyAdapter extends BaseAdapter{

private Context context;
private List<Map<String,Object>> list;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<Map<String,Object>> list){
this.context=context;
this.list=list;
mInflater=LayoutInflater.from(this.context);
}
public int getCount() {
// TODO Auto-generated method stub
if(list!=null)
return list.size();
else
return 0;
}

public Object getItem(int position) {
// TODO Auto-generated method stub
if(list!=null)
return list.get(position);
else
return null;
}

public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@SuppressWarnings("unused")
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder=null;
if(holder==null){
holder=new ViewHolder();
convertView=mInflater.inflate(R.layout.gridview_item, null);
holder.ib=(ImageButton)convertView.findViewById(R.id.ib);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
//绑定点击事件
holder.ib.setOnClickListener((OnClickListener) list.get(position).get("listen"));
//通过标志位控制按钮的Enable
if(Boolean.parseBoolean(list.get(position).get("bl").toString()))
holder.ib.setEnabled(true);
else
holder.ib.setEnabled(false);
holder.ib.setImageResource(Integer.parseInt(list.get(position).get("icon").toString()));
return convertView;
}
public final class ViewHolder{
public ImageButton ib;
}
}

2、绑定数据源

public class Main extends Activity {
/** Called when the activity is first created. */
private GridView gvtest;
private List<Map<String,Object>> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findView();
}

/*
* 定义一个标志位bl控制按钮的Enable,同时为了让每个按钮都绑定自有的点击事件提前在数据源中间各自的事件实现
*/
private void findView(){
gvtest=(GridView)findViewById(R.id.gvtest);
list=new ArrayList<Map<String,Object>>();
Map<String,Object> map;
map=new HashMap<String,Object>();
map.put("bl", true);
map.put("icon", R.drawable.menu_home_dis);
View.OnClickListener abenClick=new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "You click home menu", Toast.LENGTH_SHORT).show();
}
};
map.put("listen", abenClick);
list.add(map);
map=new HashMap<String,Object>();
map.put("bl", true);
map.put("icon", R.drawable.menu_backward_dis);
View.OnClickListener beanClick=new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "You click back menu", Toast.LENGTH_SHORT).show();
}
};
map.put("listen", beanClick);
list.add(map);
map=new HashMap<String,Object>();
map.put("bl", false);
map.put("icon", R.drawable.menu_forward_dis);
View.OnClickListener weiboClick=new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "You click forward menu", Toast.LENGTH_SHORT).show();
}
};
map.put("listen", weiboClick);
list.add(map);

MyAdapter adapter=new MyAdapter(this, list);
gvtest.setAdapter(adapter);
}
}

3、gridview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" android:gravity="center">

<ImageButton android:id="@+id/ib"
android:layout_width="60dip" android:layout_height="60dip"></ImageButton>
</LinearLayout>

4、Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<GridView android:id="@+id/gvtest"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:numColumns="3" android:stretchMode="columnWidth"
android:gravity="center" android:layout_gravity="center_horizontal"></GridView>
</LinearLayout>

[转载]Asp.net MVC3.0 入门指南 3.1视图 View

mikel阅读(862)

[转载]Asp.net MVC3.0 入门指南 3.1视图 View – 用心做事,用心做人 – 博客园.

添加一个视图

本节您将继续修改HelloWorldController类,使用视图模板去封装

简洁的HTML响应给客户端。

您将使用ASP.NET MVC 3引入的Razor视图引擎去创建一个视图模板。

基于Razor视图引擎的模板以.cshtml为扩展名,它提供一种非常优雅的

方式使用C#去生成HTML输出。当您编写视图模板时,Razor把您敲击

键盘的次数降低到了最小,coding起来非常快捷、流畅。

我们从控制器HelloWorldController类中的Index方法开始使用视图模板。

现在Index方法只返回了一个硬编码的字符串消息。改变一下Index方法,

让它返回一个View对象,代码如下:

public ActionResult Index() 
{ 
    return View(); 
}

这些代码使用视图模板去生成HTML响应给客户端浏览器。在这个项目里,
您可以给Index方法添加一个视图模板。这样来做,右键Index方法选择
添加视图。

添加视图的对话框弹出来了。保留默认选项并单击添加。

在文件夹MvcMovie\Views\HelloWorld下文件MvcMovie\Views\HelloWorld\Index.cshtml

被创建了。您可以在解决方案资源管理器中看到。

下面展示了Index.cshtml文件被创建:

在标签<h2>里添加一些HTML,被修改后的MvcMovie\Views\HelloWorld\Index.cshtml文件如下

所示:


@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

运行程序并浏览HelloWorld控制器(http://localhost:xxxx/HelloWorld)。
Index方法并没有太多的工作,它仅仅运行了一个表达式return View(),表达式
指明了这个方法将使用视图模板去呈送响应给浏览器。
因为您没有特别指明使用哪个视图模板,ASP.NET MVC默认使用\Views\HelloWorld
文件夹下的Index.cshtml视图。下图展示了视图中的硬编码。


这看起来非常棒!然而,浏览器的标题栏显示的是Index,大号的标题显示
的是"My MVC Application.",让我们改变它们!
 
下一节:Asp.net MVC3.0 入门指南 3.2视图 View
微笑
原文网址:http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part3-cs

[转载].NET实现之(套打解决方案(支持B/S和C/S))

mikel阅读(1064)

[转载].NET实现之(套打解决方案(支持B/S和C/S)) – 深度训练 – 博客园.

打印想必大家都遇到过这样的问题,不想用那些太过强大的打印控件,在我开发的过程中也遇 到了这样的情况我想要实现基本的纸面套打也就是将不同的纸面合同协议之类的A4纸打印上规定好的文字;上网搜了搜没有合适的第三方工具要么就是很复杂的报 表设计器要么就是需要一系列的注册过程的工具;

所以本人就实现了模板打印设计器组件,纸面套打支持多页同时打印.支持多份同时打印完全自动化,一键生成所有的纸面文档;

该打印工具支持C/S和B/S(ActiveX控件),的效果基本一样操作方式也基本一样;先看一下总体界面C/S界面:

B/S(ActiveX)界面:

该工具基于的是一套自定模板,通过DOM模型来实例化WINFOMR的控件位置根据底图确定坐标的位置然后通过GDI+直接打印就可以了;左边是已 生成好的自定义模板列表,中间是编辑区域可支持实时拖拽,下面是控件的属性编辑区域;选择某个属性点击右键会出来该属性的选项列表,设置好后点击应用就修 改当前模板的DOM文档;可以选择多份文档同时进行编辑;编辑完成后点击菜单栏中的文件->预览模板,就可以同时预览你所编辑的所有文档;界面上的 所有的数据都是通过后台动态绑定的可以对单个文档绑定,单份文档绑定;具体细节由于时间问题就不多讲了;本人已上传全部源码,如在使用过程中遇到问题欢迎 您找我;

下载地址为:http://files.cnblogs.com/wangiqngpei557/PrintThemp.rar

[转载]ASP.NET MVC 最佳开发实践(3)

mikel阅读(918)

[转载]ASP.NET MVC 最佳开发实践(3) | EntLib.net 技术分享平台.

ASP.NET MVC 最佳开发实践(1)
ASP.NET MVC 最佳开发实践(2)

扩展建议 – Extensibility Recommendations

ASP.NET MVC 框架中有很多点可扩展,可替换任何核心组件,下面列举了部分:

  • routing engine (MvcRouteHandler)
  • controller factory (IControllerFactory)
  • view engine (IViewEngine)

例如,你可以重写自己的Controller factory,使用IoC容器。另外,你可通过添加定制的行为来扩展框架,在框架中有一些标准的过滤器(filter),如OutputCache、HandleError和Authorize等等。

使用过滤器来添加动作

MVC支持通过attribute添加动作(filter),可在action方法和action结果之前和之后。这些过滤器在请求处理管道允许进行轻量级扩展。

过滤器可应用在action方法上,更改其行为。另外,过滤器也可应用在controller类之上,对controller类中的所有 action方法生效。可使用基类base class定义通用的行为方法,并应用过滤器在基类controller上,接着确保其他controller继承该基类。

如你想增加一个功能,记录每一次请求信息,分析HTTP header的问题。如下代码定义了一个继承ActionFilterAttribute的类:

public class LogHeadersFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (string header in
filterContext.HttpContext.Request.Headers.AllKeys)
{
Debug.WriteLine("Header " + header);
Debug.WriteLine("Value " +
filterContext.HttpContext.Request.Headers.Get(header));
}
base.OnActionExecuting(filterContext);
}
}

为了添加给filter到指定的action方法,可简单将LogHeaderFilter属性添加到Action(或Controller)上面。

可测试性建议 – Testability Recommendations

MVC模式的一个主要优点是加强可测试性,保持关注点分离。在ASP.NET MVC 应用程序的Model中,可清晰分离和测试业务逻辑。如你可测试向拍卖网站增加一条拍卖纪录,不必依赖Controller或View。

编写单元测试

ASP.NET MVC 提供了很多工具,开发人员可用来创建可测试的应用程序。此外,也相当比较简单添加第三方的单元测试框架、Mocking框架、或依赖注入容器。ASP.NET MVC 提供了灵活的架构方便单元测试。

安全建议 – Security Recommendations

安全是现代软件开发项目中一个很重要的方面。尽管没有框架提供完美的安全,但有很多地方可做,来保护ASP.NET MVC 应用程序。

安全保护以防攻击

网站安全需要考虑所有web开发人员编写的企业级网站和服务,有许多众所周知的工具,如下所示:

  • Cross-site scripting (XSS) attacks
  • SQL injection
  • Cross-site Request Forgery (XSRF)
  • Improperly implementing model binding

(1) 阻止跨站攻击(XSS):

  • 使用ValidateInput 属性禁止无效的请求;
  • 在所有显示用户输入数据的地方使用Html.Encode,不管是立即呈现或数据将存入数据库,然后显示;
  • 在Cookies上设置HttpOnly标识,阻止JavaScript读取和发送Cookies;

(2) 阻止SQL注入攻击:

  • 总是使用参数化SQL查询;
  • 不要传递未经检验的SQL脚本到数据库;
  • 使用ORM工具,如Entity Framework,可完全消除在应用程序代码中编写SQL语句;

(3) 阻止跨站请求伪造攻击:

  • 在表单中使用Html.AntiForgeryToken 类阻止跨站伪造情况。在接收post请求的Action方法上设置ValidateAntiForgeryToken 属性;

(4) 正确实现model binding:

  • 显式指定模型绑定的类成员名称,如[Bind(Include=显式属性名称)];
  • 还可创建视图模型(View model),用来接收外部表单输入,视图模型仅包含外部输入的属性;

对用户进行验证和授权保护内容

对于受限的数据视图,通过编写自定义的RoleProvider,或使用Authorize 过滤器属性。

使用<%: %> (.NET 4) 保护,以防XSS攻击

在.NET 4.0 之前,开发人员通过使用如下代码,来确保编码HTML:

<%= Html.Encode(ViewData[“name”]) %>

上述代码以防 XSS (cross-site scripting) 攻击。

如果你使用.NET 4,可不必使用上面的语法,简化语法如下:

<%: ViewData[“name”] %>

该脚本会自动对字符串进行HTML编码(如有必要)。

[转载]ASP.NET MVC 最佳开发实践(2)

mikel阅读(925)

[转载]ASP.NET MVC 最佳开发实践(2) | EntLib.net 技术分享平台.

本文提供了一些代码设计准则,目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序,当然,你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译,欢迎分享和交流ASP.NET MVC 项目开发设计思路。

Controller 建议 – Controller Recommendations

Controller 和指定的Action方法由路由系统根据匹配的URL规则调用。Controller 接收路由系统的输入参数,包括HTTP 请求上下文(Session、Cookies、Browser等等)。

使用Model Binding,而不是手动解析请求。

ASP.NET MVC 通过Model binding 抽象了许多对象反序列代码,Model binding机制是将Request Context数据通过反射对应到Action方法中定义的对象类型上。

如下代码是Seller类,定义了表单提交的数据:

public class Seller
{
public Int64 ID { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
}

如下的是Register View 表单:

<% using (Html.BeginForm()) { %>
<legend>Account Information</legend>
<p>
<%= Html.TextBox("Name") %>
</p>
<p>
<%= Html.TextBox("Phone") %>
</p>
<p>
<%= Html.TextBox("Address") %>
</p>
<p>
<input value="Register" />
</p>
<% } %>

Controller 需要Register Action 方法,提供Model binding:

public ActionResult Register([Bind(Exclude="ID")] Seller newSeller)
{
...
}

默认的model binder 会寻找类中的每一个属性,以Name 为例:

(1) 先查找Request.Form[“Name”];
(2) 接着RouteData.Value[“Name”];
(3) 接着 Request.QueryString[“Name”];
(4) 最后如没有匹配,则为null;

从Register action方法可以看到,通过默认的model binder,对象属性将被赋值。Model binding系统也会进行验证逻辑,如data annotations attributes。

Model binding系统有丰富的扩展机制,可对object的创建、赋值和验证进行全面定制。

在Action方法中显示命名View。

在action方法中完成必要逻辑后,最后返回ViewResult 或 PartialViewResult对象。如不传入View名称给result 类,View 文件将默认为action 名称。如一个名为Products的Controller,有一个List 的Action方法,在List action方法调用 return View() 方法,且不传入任何参数。MVC 框架将寻找 /Views/Products/List.aspx 视图,如不存在,则继续寻找 /Views/Products/List.ascx。如仍不存在,则尝试 /Views/Shared/List.aspx和/Views/Shared/List.ascx。你可使用/Views/Shared 存放多个Controllers共享的视图。

为了避免混淆,在action方法中,显式命名View,如 return View(“explictViewName”),这样可从不同的Action调用List视图。

在提交表单时使用Post/Redirect/Get(PRG)

根据HTTP POST 和 GET 的定义:

HTTP GET 用于不更改Model数据;
HTTP POST 用于更改Model 数据;

下面是一个清晰的描述,在post back的action方法接收表单数据,返回 RedirectToAction(),该方法导致一个HTTP 302 (临时跳转),并对方法生成GET请求,这就是Post – Redirect – Get 模式。

传统的ASP.NET 表单回传数据,有可能导致数据的重复提交,可通过MVC Post-Redirect-Get模式解决这一问题。

但是,这一模式会造成client-side性能影响,因为redirect跳转会再次请求服务器,需要在性能成本和可用性之间进行判断。

实现HandleUnknownAction 和 HandleError

默认的unknown action响应是404(Not found)错误。可在Controller中重载HandleUnknownAction,针对这一错误实现一个默认视图。此外,可在controller的action方法添加HandleError属性,针对未捕获异常提供标准的错误视图。

路由建议 – Routing Recommendations

ASP.NET MVC 中路由映射 URL 直接到controller,而不是一个特定的文件。默认的路由添加到RouteTable,在Global.ascx文件的Application_Start中定义。该路由表负责映射特定URL到Controller和Action。

当时使用标准路由时,从特定的路由到一般路由进行排序。

路由表是有序的,因此按特定的到一般规则来创建路由。举一个示例,假定你有一个product category需要创建URL:

* http://sellmyproducts/
* http://sellmyproducts/Page#
* http://sellmyproducts/category
* http://sellmyproducts/category/Page#

假定List方法定义如下(在ProductsController 类中):
Public ViewResult List(string category, int page)

基于之前指定的URL,下面的路由规范将正确路由用户到正确的视图:

routes.MapRoute(
 
null,
 
"",
 
new { controller = "Products", action = "List", category = (string)null, page = 1 }
 
);
 
routes.MapRoute(
 
null,
 
"Page{page}",
 
new { controller = "Products", action = "List", category = (string)null },
 
new { page = @"\d+" }
 
);
 
routes.MapRoute(
 
null,
 
"{category}",
 
new { controller = "Products", action = "List", page = 1}
 
);
 
routes.MapRoute(
 
null,
 
"{category}/Page{page}",
 
new { controller = "Products", action = "List"},
 
new { page = @"\d+" }
 
);

使用命名的路由机制,避免路由歧义

在使用ASP.NET 路由机制时,必须知道路由机制是如何工作的。否则,会浪费很多时间去跟踪错误的路由。有一个办法是显式命名路由,可缓解这一问题。

如下路由映射定义了命名路由:

routes.MapRoute(
 
"Default",
 
"",
 
new { controller = "Products", action = "List", category = (string)null, page = 1 }
 
);
 
routes.MapRoute(
 
"PageRoute",
 
"Page{page}",
 
new { controller = "Products", action = "List", category = (string)null },
 
new { page = @"\d+" }
 
);

使用这些路由定义,可创建PageRoute路由链接:

<%= Html.RouteLink("Next", "PageRoute",
new RouteValueDictionary( new { page = i + 1 } )); %>

[转载]ASP.NET MVC 最佳开发实践(1)

mikel阅读(772)

[转载]ASP.NET MVC 最佳开发实践(1) – Rickie is back …. 人生·工作的结果=思维方式×热情×能力 – 博客园.

本文提供了一些代码设计准则,目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序,当然,你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译,欢迎分享和交流ASP.NET MVC 项目开发设计思路。

Model建议 – Model Recommendations

Model是定义业务领域相关的对象,应该包含业务逻辑(对象如何动作和关联),验证逻辑(验证对象的有效值),数据逻辑(数据对象如何持久化),和会话逻辑(跟踪用户状态)。

创建独立的Model项目,在ASP.NET MVC 项目中引用Model程序集。

将所有业务逻辑放置在Model中。

如将所有业务逻辑放置在Model项目中,可根据实际业务数据来生成ViewController。有如下好处:

  • 减少重复的业务逻辑。
  • View中减少业务逻辑,View易于理解。
  • 业务逻辑的测试仅仅和Model有关。

例如,下面需要显示用户的用户名先显示Last Name,在View中代码如下:


&lt;% if (String.Compare((string)TempData["displayLastNameFirst"], "on") == 0)        { %&gt;
Welcome, &lt;%= Model.lastName%&gt;, &lt;%= Model.firstName%&gt;
&lt;% }        else        { %&gt;
Welcome, &lt;%= Model.firstName%&gt; &lt;%= Model.lastName%&gt;
&lt;% } %&gt;

然而你需要在每一个地方重复这一逻辑。如将这一业务逻辑放置在Model中,可在Model中添加一个属性封装这一逻辑。

public string combinedName
{
get
{
return (displayLastNameFirst ? lastName + " " + firstName : firstName + " " + lastName);
}
private set
{
;
}
}

样,可大大简化视图代码:

<% Welcome, <%= Model.combinedName %> %>

将所有验证逻辑放置在Model

所有输入验证应该在Model层,包括Client-side 验证。

可使用ModelState 添加验证检查,代码如下所示:

if (String.IsNullOrEmpty(userName))

{

ModelState.AddModelError(“username”, Resources.SignUp.UserNameError);

}

不过,更好的办法是使用 System.ComponentModel.DataAnnotations,在Model类的属性上添加attribute,如下所示:

public class User

{

[Required(ErrorMessageResourceName = “nameRequired”, ErrorMessageResourceType = typeof(Resources.User))]

public String userName { get; set; }

}

为数据访问定义接口

接口用来暴露数据访问类的方法,强化ASP.NET MVC 的松散耦合设计。

可考虑使用Entity Framework LINQ to SQL 创建对数据库的访问类,Entity Framework LINQ to SQL 都支持存储过程。

将所有会话逻辑放置在Model中。

View 建议 – View Recommendations

View用来展示Model数据,Controller负责选择View。业务逻辑不属于ViewModel负责业务逻辑。View非常灵活,如ModelView可通过HTML显示,同样的Model也可通过XML 视图来呈现。

HTML放置在ViewPartial View中(不要在Controller中)

默认的ASP.NET视图引擎提供了如下视图文件:HTML View.aspx),Partial HTML View.ascx)和Master page.master

如下视图演示了对partial view的调用:

<%@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage” %>

Below is a list of items submitted by <b>

<%= Html.Encode(ViewData[“name”]) %></b>.

<p>

<div id=”items”>

<% Html.RenderPartial(“ItemsByName”);%>

</div>

</asp:content>

Partial viewItemsByName.ascx)如下所示:

<%@ Control Language=”C#” %>

<% foreach (Seller.Controllers.Items item in (IEnumerable)ViewData.Model)

{ %>

<tr>

<td>

<%= Html.Encode(item.title)%>

</td>

<td>

<%= Html.Encode(item.price)%>

</td>

</tr>

<% } %>

</table>

<% } %>

Partial View 是一个强大的扩展和重用机制。你可在不同的地方包含相同的View,不必编写重复的代码。

View中使用ViewData访问数据

ASP.NET 提供了如下机制在View模板中访问数据:

ViewData.Model 对象Controlleraction方法中,在return语句中传入一个Model对象(return View(myModelObject))。

ViewData Dictionary – action方法中存入数据(ViewData[“key”] = value),接着在View中方法相同的dictionary

在可能的情况下,应该是一ViewData Model,而不是ViewData 来访问数据,因为Model 提供了类型安全。此外,你应在View模板中,使用数据访问机制,而不是Request / Session 来访问。

如需要显示一个对象的多个属性,可使用ViewData.Model,并创建一个强类型View。针对seller详细页面,seller类有namephoneaddressemail等等属性,在呈现View之前,你可在Controller中对ViewData.Model 赋值seller对象实例。但是如果是一些零散的数据,如page#、用户名和current time,则一般使用ViewData字典。

在使用模型绑定(Model bingding)时,避免在view中访问数据。

Controller 中访问数据库,在执行View之前,将从数据库中检索的数据复制给轻量的View Model对象,这样,轻量的View Model对象不必在视图执行时检索数据。

使用(自动生成)客户端验证

ASP.NET MVC 2 开始,可以很容易添加客户端验证。

(1) 如前所述,在Model层中添加数据验证逻辑;

(2) 确保项目中Scripts目录有如下JavaScript 文件:MicrosoftAjax.js MicrosoftMvcValidation.js

(3) 在表单提交页面,添加如下代码:

<script src=”<%= Url.Content(“~/Scripts/MicrosoftAjax.js”) %>” type=”text/JavaScript”></script>

<script src=”<%= Url.Content(“~/Scripts/MicrosoftMvcValidation.js”) %>” type=”text/javascript”></script>

(4) 在表单中添加如下代码:

<% Html.EnableClientValidation(); %>

现在如果编辑表单内容,当输入值不合格时,客户端马上进行验证提醒。

在模板中插入server-side 注释

View模板中使用服务端注释,在HTML呈现时,会剔除。

如下是server-side注释:

<%– This is a server side template comment –%>

不要在View模板中使用HTML 注释,因为这些注释会呈现在web浏览器中,可被用户看到。

使用HTMLHelper 扩展方法。

System.Web.Mvc.Html 类中包含了很多有用的HTML 扩展方法。

Form 表单生成(BeginForm

输入字段生成(checkboxhiddenradio buttontextbox

链接URL生成(ActionLink

XSS保护(Encode

尽可能使用这些HTML扩展方法,如下是使用route table创建一个链接:

<%= Html.ActionLink(“Home page”, “Default”) %>

后续相关文章,可参考如下链接:

[转载]Android关于ListView (1)——异步加载图片

mikel阅读(958)

[转载]关于ListView (1)——异步加载图片 – 没有代码 – 博客园.

效果:

主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等

项目的布局如下:

首先加入网络的权限

<uses-permission Android:name=”Android.permission.INTERNET” />

工具类,主要根据url读取图片返回流的方法

Request.java

public class Request {

public static InputStream HandlerData(String url) {

InputStream inStream=null;

try {

URL feedUrl = new URL(url);

URLConnection conn = feedUrl.openConnection();

conn.setConnectTimeout(10 * 1000);

inStream = conn.getInputStream();

} catch (Exception e) {

e.printStackTrace();

}

return inStream;

}

}

ListViewReadImageAscy.java

private ImageAdapter adapter;

//数据源

private ArrayList beans = new ArrayList();

//内部类
public class Bean {

private Bitmap image;

public Bitmap getImage() {

return image;

}

public void setImage(Bitmap image) {

this.image = image;

}

}

扩展BaseAdapter

public class ImageAdapter extends BaseAdapter {

public ImageAdapter(Context context) {

}

@Override

public int getCount() {

return beans.size();

}

@Override

public Bean getItem(int position) {

return beans.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ImageView i = new ImageView(getApplicationContext());

Bean b = beans.get(position);

//如果有图片则读取,没有则跳过

if (b.getImage() != null) {

i.setImageBitmap(b.getImage());

}

return i;

}

}

/异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。

//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。

public class ImageLoadTask extends AsyncTask {

private ImageAdapter adapter;

// 初始化

public ImageLoadTask(Context context, ImageAdapter adapter) {

this.adapter = adapter;

}

@Override

protected Void doInBackground(Void... params) {

for (int i = 0; i &lt; adapter.getCount(); i++) {

Bean bean = adapter.getItem(i);

Bitmap bitmap = BitmapFactory

.decodeStream(Request

.HandlerData("http://avatar.profile.csdn.net/A/E/5/2_piaopiaohu123.jpg"));

bean.setImage(bitmap);

publishProgress(); // 通知去更新UI

}

return null;

}

public void onProgressUpdate(Void... voids) {

if (isCancelled())

return;

// 更新UI

adapter.notifyDataSetChanged();

}

}

设置数据源

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

for (int i = 0; i &lt; 15; i++) {
Bean b = new Bean();
b.setImage(BitmapFactory.decodeResource(getResources(),
R.drawable.icon));

beans.add(b);
}

adapter = new ImageAdapter(this);
ListView listview = new ListView(this);
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
setContentView(listview);

new ImageLoadTask(this, adapter).execute();
}

本文为原创,如需转载,请注明作者和出处,谢谢!

http://www.cnblogs.com/not-code/archive/2011/05/03/2035421.html

代码下载

http://files.cnblogs.com/not-code/ListViewReadImageAsyn.rar

[转载]Asp.net MVC3.0 入门指南 2.控制器Controller

mikel阅读(904)

[转载]Asp.net MVC3.0 入门指南 2.控制器Controller – 用心做事,用心做人 – 博客园.

添加一个控制器

MVC代表model-view-controller。MVC对开发应用程序来说,

是一种很好的架构和便于维护的模式。基于MVC的程序包含:

  • 控制器:负责处理外部请求,获取模型数据,提取视图模板(负责返回请求给客户端)
  • 模型:代表应用程序的数据并使用验证逻辑去执行数据的业务规则
  • 视图:用来动态生成HTML响应的一些模板文件

在这个教程里将会包含所有上述概念并告诉您如何去使用他们去创建应用程序。

让我们开始创建一个控制类。在解决方案资源管理器中,右键Controller文件夹并选择添加Controller。

命名新的控制器为“HelloWorldController”。保留默认的模板为 Empty controller 。单击Add。

注意:在解决方案资源管理器中一个新的文件已经被创建,名字为HelloWorldController.cs.

文件已经在IDE中打开。

在程序块public class HelloWorldController的内部,创建两个方法,代码如下。

作为例子,控制器将返回一个HTML字符串。

using System.Web;
using System.Web.Mvc;

namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/

public string Index()
{
return "This is my <strong>default</strong> action...";
}

//
// GET: /HelloWorld/Welcome/

public string Welcome()
{
return "This is the Welcome action method...";
}
}
}

的控制器被命名为HelloWorldController并且第一个方法被命名为Index。

让我们从浏览器调用它。运行应用程序(按F5或Ctrl+F5)。在浏览器中地址栏

中追加"HelloWorld"。(例如:在下面的插图中,这样写http://localhost:43246/HelloWorld.

浏览器页面中返回结果如下边屏幕截图。上面的方法中,代码直接放回了字符串。

您告诉系统仅仅返回一些HTML,它做到了!

URL的第一部分决定了执行哪个控制器类。所以 /HelloWorld 映射到 HelloWorldController 类。

URL的第二部分决定了执行控制器类中的哪个操作(方法)。所以/HelloWorld/Index 触发了

HelloWorldController 类的Index方法。

注意:Index方法被用作默认方法。

这就是为什么如果没有明确指定方法时,Index方法将会被调用的原因。

浏览ttp://localhost:xxxx/HelloWorld/Welcome.  Welcome方法返回

字符串”This is the Welcome action method…”.

MVC默认映射为/[Controller]/[ActionName]/[Parameters].

对于这个URL来说,控制器是HelloWorld,Welcome是响应方法。

您不用必须使用[Parameters]。

让我们稍微修改一下以便您可以通过URL传递参数给控制器。(比如,

/HelloWorld/Welcome?name=Scott&numtimes=4). 改变Welcome

方法,像下面一样添加两个参数。注意,代码中使用C#的可选参数特性

指明参数numTimes默认值为1(不传递该参数时)


public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

运行应用程序并浏览URL(http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4).
您可以为name和numtimes多试几次其他的值。系统自动从URL请求字符串中映射到您的方法中
相应的参数上。

在这两个例子中控制器已经完成了MVC中的“VC”,也即是说,视图和控制器已经

工作了。控制器直接返回了HTML.通常您不想让控制器直接返回HTML,因为这会变成

非常累赘的代码。我们通常使用一个单独的视图模板文件来帮助生成HTML响应。

让我们来看看我们如何能够做到这一点。

下一节:视图 View

原文网址:

http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part2-cs

[转载]Asp.net MVC3.0 入门指南 1.简介

mikel阅读(897)

[转载]Asp.net MVC3.0 入门指南 1.简介 – 用心做事,用心做人 – 博客园.

简介

该教程将教会您如何使用Microsoft Visual Web Developer 2010 Express Service Pack 1(免费版本的Visual Studio),

去创建一个ASP.NET MVC网页程序。可以通过Web Platform Installer安装。

在所有开始之前,请确定您的机器已经安装了如下所列的必备组件:

· Visual Studio Web Developer Express SP1 prerequisites

//译者注:建议大家使用Visual Studio 2010+sp1

· ASP.NET MVC 3 Tools Update

· SQL Server Compact 4.0 (runtime + tools support)

//译者注: SQL Server7、SQL Server2000、SQL Server2005、SQL Server2008也可以

如果您正在使用Visual Studio 2010而不是Visual Web Developer 2010,

安装必备的组件通过点击下面的链接:Visual Studio 2010 prerequisites

准备创建什么

您将完成一个简单的电影列表程序,支持从数据库创建、编辑和展示电影列表。

下面是两个程序截屏。它包括了一个显示所有电影的列表页面:

该程序也支持您添加、编辑和删除电影,并可以查看某个电影的细节。

所有的数据输入都包含了验证,以确保存入数据库的数据是正确的。

您将学到的技能

学到技能如下:

  • 如何创建ASP.NET MVC 工程
  • 如何创建ASP.NET MVC控制器和视图
  • 如何使用实体类框架的代码优先(Code First)创建一个新的数据库
  • 如何获取并展示数据
  • 如何编辑数据并进行数据验证

开始

打开Visual Studio 2010,在启动页面选择新建项目。

Visual Studio是一个集成开发环境。

创建您的第一个应用

您可使用Visual Basic或C#创作为编程语言创建应用程序。

选择左边的Visual C#然后选择ASP.NET MVC 3 Web Application.命名项目为“MvcMovie”,单击OK。

在新弹出的 New ASP.NET MVC 3 Project窗口,选择Internet Application.

确保Use HTML5 markup并保留Razor作为默认的视图引擎。

单击OK。您刚才创建的ASP.NET MVC程序,Visual Studio使用默认的模板,

所以您没有做任何工作就已经完成了一个可以工作的应用程序。

这是一个简单的“Hello World!”程序,它是您开始应用程序的一个好地方。

“调试”菜单,选择“开始调试”

您也可以使用快捷键F5开始调试。

Visual Studio启动一个浏览器并打开程序的主页面。注意地址栏的显示的是localhost而不是形如example.com。

这是因为localhost总是指向您的本地计算机,在这种情况下它指向您刚才创建的应用程序。当Visual Studio启动一个网络项目时,

一个随机的端口被web server使用。如下图所示,这是随机的数字是43246.当您运行程序时,您可能看到的是一个不同的端口。

下一节:控制器Controller

原文网址:http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs

[转载]Android学习系列(6)--App模块化及工程扩展

mikel阅读(836)

[转载]Android学习系列(6)–App模块化及工程扩展 – 谦虚的天下 – 博客园.

软件业界,无时无刻不在创造,也无时无刻不在重复,就是这样,无所谓对和错,但是我们要精诚合作。
这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。
这篇文章很简单,但是很重要,真的很重要,特此隆重推荐!

1.需求
无论是在.net还是java平台,合理的分层架构是最普遍的模块化思路之一。
dll,jar文件无不风靡盛行,无处不在,使用它们的好处,我们不必在此多言。
一天,tx团队和我说,我们现在要做Android上做三个论坛的客户端,一个是新闻论坛,一个是文学论坛,一个是音乐论坛。除了数据,界面和很少的模块不一样,其他的都一摸一样。
OK,动工!好,想一想…
jar是我第一刻就想到的东西,但是共用的jar文件无法方便的共享资源或者覆盖资源。
而我们也不会傻傻的单独做三个客户端的吧,也不会傻傻的做3个客户端再傻傻的copy3份,依次修改吧。

2.问题
在Android工程中如何开发一个共用Framework,能共用资源,代码,但是也能扩展?

3.使用硬编码判断
有人提出了一种方案, 在代码里面判断:

if(新闻论坛) {
//加载新闻论坛的资源
//执行新闻论坛的代码
//显示新闻论坛的效果
}else if(文学论坛) {
//加载文学论坛的资源
//执行文学论坛的代码
//显示文学论坛的效果
}else if(音乐论坛) {
//加载音乐论坛的资源
//执行音乐论坛的代码
//显示音乐论坛的效果
}
PS:这是一种很无奈的办法,代码丑陋,扩展性差,有没有更好的办法呢?

4.使用Android Library分离工程
Android Library提供了一个类似于其他平台的库的概念,这个库不仅能公用代码,还能共用资源,还能覆写资源。
Android Library是以工程的颗粒来复用,引用它的工程,其实就是引用它的代码,然后生成R.java和主工程需要的资源,而剔除Library中被覆盖的资 源。其中Library中的AndroidManifest.xml不能复用,也就是说主工程必须重新定义AndroidManifest.xml,这个 也很容易理解,AndroidManifest.xml本来就是工程的一个配置文件,一般来说不具备共用的库的通用性。
步骤如下:
第一步:新建Android工程common。
第二步:右键common,选择Properties,在Android标签页,选中”Is Library” ,如下图。

第三步: 新建主工程新闻论坛tianxianews。
第四步: 右键tianxianews,选择Properties,在Android标签页,点击Add,选中common。如下图。
查看最后的工程结构:
此时此刻,common工程天衣无缝成了tianxianews工程的一部分。
我们展开tianxianews工程的gen目录:

eclipse为了生成了两个R.java,一个是common工程的,一个tianxianews工程的,但是内容是一摸一样的,这样做的好处 是:R.java里面的内容包括两个工程资源,第一,tianxianews工程通过R.java能调用到common工程的资源;第二,如果有覆写的资 源,生成apk的时候,tianxianews工程覆盖common工程的资源,因为两个R.java内容一样,common代码调用的R.java中的 资源,实际上调用的是tianxianews资源,这个特性类似如面向对象的继承的概念。
我们还可以另外新建tianxiamusic,tianxialiterature工程,都引用common,这样我们三个工程就能共用common,这样我们就可以只在common一个工程中开发了。
在这里,具体的使用步骤我没有截图出来,主要是没什么技术,也没什么好说的,就是两个字:覆盖。

5.小结
Android Library为Android模块化和工程扩展提供了一个很好的工具或者方式。随着项目的增大,资源的共享,模块化和扩展的这种需求更是日益凸显,它不 仅去掉了代码的丑陋,而且减少了开发量,带来的益处不少。同时由此我们也可以看出来Android的不成熟,他们为我们大型工程提供的方案还是太少,这可 能也有源自手机平台本身的局限性吧,我们期待Android市场走向更强大,技术走向更强悍。