【分部视图】 ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control。我们的页面往往会有许多重用的地方,可以进行封装重用。使用 部分视图 : 1. 可以简写代码。2. 页面代码更加清晰、更好维护。 【如何使用】 在视图里有多种方法可以 加载部分视图,包括: Partial() Action() RenderPartial() RenderAction() RenderPage() 方法。 以下是这些方法的差别: Partial 与 RenderPartial 方法 1. Razor 语法:@Html.Partial() 与 @{Html.RenderPartial();} 2. 区别:Partial 可以直接输出内容,它内部是 将 html 内容转换为 string 字符(MVCHtmlString),然后缓存起来, 最后在一次性输出到页面。显然,这个转换的过程,会降低效率,所以通常使用 RenderPartial 代替。 RenderPartial 与 RenderAction 方法 1. Razor 语法:@{Html.RenderPartial();} 与 @{Html.RenderAction();} 2. 区别:RenderPartial 不需要创建 Controller 的 Action ,而 RenderAction 需要在 Controller 创建要加载的 Action。 RenderAction 会先去调用 Contorller 的 Action ,最后再 呈现视图,所以这里 页面会在 发起一个链接。 如果这个部分视图只是一些简单 的 html 代码,请使用 RenderPartial。 但如果这个部分视图 除了有 html 代码外, 还需要 通过 读取数据库里的数据 来渲染,就必须使用 RenderAction […]
View Details1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity 对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef 添加一条记录后,如何获取新记录的ID值?如下代码:
1 |
var te = new TestEntity () { Name = "名字", Age = 21 }; using (EFDbContext context = new EFDbContext()) { context.TestEntity .Add(te); context.SaveChanges(); return te.ID; } |
调用SaveChanges()之后,ef.ID的值就是数据库中新加记录对应自增标识列的值。Linq to ef智能地判断出ID就是自增主键标识列。 他给我们返回了。 2:列名叫“ID”的列,它不是自增列,linq to ef不让插入的问题 如标题,就是,列名叫“ID”的列,它不是主键,也不是主键,linq to ef不让插入。我已经给ID赋值了 但它一直提示 ID不能为NULL ,打断点,看了,也有值! 代码走到SaveChanges(),就报异常,提示ID不能为空!超蛋疼… 原因:默认情况,linq to ef认为只要实体类中有ID属性,数据库对应的是一定是自增标识列。 解决方式: 1)第一步 因为EFDbContex继承自Context类,所以,我们需要从新对它这个叫OnModelCreating的虚函数进行实现
1 |
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<TestEntity>().Property(p => p.ID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); } |
2)第二步 在实体类叫ID的属性上加标记实现(记得添加引用):
1 |
public class TestEntity { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } |
from:http://www.ithao123.cn/content-2766171.html
View Details准备一些测试数据,如下: use Test Create table Student( ID int identity(1,1) primary key, [Name] nvarchar(50) not null ) Create Table Book( ID int identity(1,1) primary key, [Name] nvarchar(50)not null, StudentID int not null ) insert into Student values('张三') insert into Student values('李四') insert into Student values('王五') select * from student --张三借的书 insert into Book values('红楼',1) insert into Book values('大话红楼',1) --李四借的书 insert into Book values('三国',2) --王五没借书 --一本错误的记录 insert into Book values('错误时怎样练成的',111) --左连接 select s.name,b.name from student as s left join Book as b on s.id=b.studentid --右连接 select s.name,b.name from student […]
View Detailsusing System; using System.Data; using System.Configuration; using System.Collections; using System.Drawing; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class study_CheckCode2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string code = CreateVerifyCode(); //取随机码 CreateImageOnPage(code, this.Context); // 输出图片 Response.Cookies.Add(new HttpCookie("CheckCode", code.ToUpper()));// 使用Cookies取验证码的值 } #region 验证码长度(默认4个验证码的长度) int length = 4; public int Length { get { return length; } set { length = value; } } #endregion […]
View DetailsC#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi in t.GetProperties { object value1 = pi.GetValue(tc, null));//用pi.GetValue获得值 string name = pi.Name;//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作 //获得属性的类型,进行判断然后进行以后的操作,例如判断获得的属性是整数 if(value1.GetType() == typeof(int)) { //进行你想要的操作 } } 注意: 必须要设置了get 和set方法的属性,反射才能获得该属性 public int Pid { get { return pid; } set { pid = value; } } from:http://virgoooos.iteye.com/blog/623561
View Details
1 2 3 4 5 6 7 |
static List<T> GetPageList(Func<T,bool> whereLambda,Func<T,object> orderLambda,int pageSize,int pageIndex) where T:class { EFEntities context=new EFEntities();//实例化上下文 var list=context.Set<T>().where(whereLambda).orderByDescending(orderLambda).Skip((pageIndex-1)*pageSize).Take(pageSize).Select(s=>s); return list.ToList(); } |
完善后
1 2 3 4 5 6 7 8 9 |
//EF lanbda 分页 public List<dynamic> getPageDate<T, TKey>(Expression<Func<T, dynamic>> select, Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, int pageIndex, int pageSize, out int Total) where T : class { CIK_NewsEntities db = new CIK_NewsEntities(); Total = db.Set<T>().Where(where).Count(); var list = db.Set<T>().Where(where).OrderByDescending(order).Select(select).Skip((pageIndex - 1) * pageSize).Take(pageSize); return list.ToList(); } |
使用:
1 2 3 4 |
int Total_ = 0; rptCate.DataSource = getPageDate<Category, int>(c => new { c.Name, c.CreatedDate, c.CreatedBy }, c => c.Id > 0, c => c.Id, 2, 4, out Total_); rptCate.DataBind(); this.Label1.Text = Total_.ToString(); |
FROM:http://www.cnblogs.com/juexin/p/4273490.html
View DetailsAndroid开发者选项,看起来很简单的事情,其实很多同学对它了解得不够,Google用心良苦得为我们设计了这么多小开关都是有它的作用的,今天也花了点时间,过了一遍全部的30多个开关,从中整理出15个对日常Android开发比较有帮助的选项。 需要指出的是,不同的ROM对开发者选项的支持不一样,精简掉一些很正常,我下面提到的都是官方支持的功能,当然不同的官方版本支持程度也不一样,你手机上找不到也别奇怪。 抱歉这里不介绍开发者选项在哪怎么开启之类的问题。 1. Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开启它后只要插着USB线就不需要总去解锁屏幕啦。 2. Select runtime(Dalvik or ART) ART runtime下你的应用会更加丝滑,目前高版本的Android上已经直接是ART runtime了,但作为Android开发也许需要保证你的应用在两种runtime下都能正常运行,这可能是测试时需要更多考虑的。 3. Process stats 里面有关于当前运行进程的一切信息,对于一般用户,它就是一堆无意义的数字,对于Android开发人员来说,调试时这些信息也许可以帮你大忙。 4. USB debugging 这个无需介绍,不开它怎么调试呢?(虽然现在都流行无线调试了) 5. Allow mock locations 当你的应用需要用到GPS功能,获取位置信息时(比如天气应用),可以通过它搭配一些位置模拟应用,模拟全球任何地点。(还能干什么?机智的你肯定想到啦) 6. Show surface updates 在界面绘制时,闪烁提醒,开启它后简直能闪瞎你的眼睛,但有时候我们需要精确知道具体的界面绘制细节时,不得不需要忍受这种折磨。 7. Show layout bounds 显示布局格子,当你看到一个应用有很棒的界面效果,想知道它是怎么布局的?开启这个功能即可。我更常用的使用场景是:每当有PM过来问我人家这个界面是Native实现的,还是类似Hybrid方案的Web实现时,我就让他开启这个功能,WebView是一个整体的格子,Native View是各种小格子组合而成。(除非自己重绘实现自定义View, 一般复杂布局也不会这么干) 8. Force RTL layout direction 强制RTL布局,RTL也就是Right To Left,阿拉伯国家一般有这种文化,类似古时候的中国,文字从右往左读,包括界面布局也是从右往左的,感觉操作习惯都跟我们是镜像的,如果你跟我一样不幸需要做这种坑爹适配的话,这也是必须掌握的技能。 9. Animation scale 动画的尺度、速度调整也是很有用的功能,尤其在实现复杂的组合动画效果时,调慢点可以看得更清楚,当然你可以在自己代码里调慢,但每次改代码重新build很麻烦对不对?而且如果是PM走过来让你研究一下某款App的酷炫动画效果呢? 10. Simulate secondary displays 它允许你模拟不同屏幕尺寸下应用的表现,IDE里虽然也有类似的功能,可那毕竟只是个静态的效果。 11. Debug GPU overdraw 这里是指不正确的过度绘制: 原色: 没有过度绘制 蓝色: 一次过度绘制 绿色: 两次过度绘制 粉色: 三次过度绘制 红色: 四次及以上过度绘制 值得提醒的是,过度绘制有时是无法避免的,Android建议是不要超过一次过度绘制,也就是可以是蓝色的,不能绿了。 12. Strict mode enabled 严苛模式下,当应用做了一些影响性能的事情,屏幕会闪一下提醒你。你也可以在代码里为自己的应用开启严苛模式,一旦发现一些性能问题,就会有详细Log输出, 为避免影响线上用户,建议只在Debug模式下开启。 13. Show CPU usage 在你屏幕右上角显示一个小窗口,提示当前CPU的各种信息,在性能调试时会有一些帮助,看是否是CPU的负载过高导致了性能问题。 14. Profile GPU rendering […]
View Details又来一篇,大家也许都嫌烦了。但是写博客既能提高自己,又能帮助别人,而且每次写的过程中和发布出来之后都有收获,真是太赚了!麻烦大家忍一忍吧。 言归正题,在之前的一篇随笔“准备用Entity Framework实现数据的按需更新”中,我们实现了按需更新,但和这里的指定字段更新的应用场景不一样。 之前的按需更新的应用场景是:把需要更新与不需要更新的数据都给Entity Framework,由EF自己判断实际需要更新哪些。 现在的应用场景是:我明确知道要更新哪个字段,让EF做的只是更新这个操作,其他不用操心。 下面我们通过一个比喻来比较一下两者的区别。 比如我有一辆车想在汽车修理店更换一些部件。我把车停在车库里,来到修理间。这时,我就不能再直接接触这部车,必须通过修理间的工作人员。工作人员给我一个汽车模型,我有任何更换部件的想法,只能通过这个模型告诉他。 对应于第一种按需更新的场景,我不知道汽车需要实际更换哪些部件,我只知道更换后应该是什么样的。 流程是: 1. 告诉工作人员车牌号码,让他按照我放在车库中的汽车,制作一个一模一样的模型。 2. 工作人员把制作好的模型交给我。 3. 我在这个汽车模型的基础上修改成我想要的样子(但我不知道哪些部件要换,哪些部件不要换)。 4. 把修改好的汽车模型交给工作人员,让他去修理就行了。 5. 我悠然自得地去逛街,不用操心任何事。 对应于第二种根据指定字段更新的场景,我要更换前车灯,汽车修理店你不用管前车灯有没有坏,我就是要换,就是想让你们挣钱。 流程是: 1. 我随手从旁边拿了一个空汽车模型,修改为我想要的前车灯。 2. 把这个汽车模型交给工作人员,让他去修理就行了。 3. 我悠然自得地去逛街,不用操心任何事。 对于第二种场景,如果我们采用第一种场景的操作流程,工作人员累,效率低,费用自然也高。用第二个流程是必然的选择。 今天,我们终于找到了针对第二个流程的解决方法。 比如,我们要更新某个Blog的上次更新时间,我们只需要: 1. 新建一个Blog实体对象,告诉他要更新的Blog的ID以及“上次更新时间”。 2. 把这个实体对象交给Entity Framework,让他完成更新。 代码如下: public void UpdateBlogCoinfigLastUpdatedTest() { using (BlogDbContext context = new BlogDbContext()) { var blog = new Blog() { BlogID = 0, LastModified = DateTime.Now }; context.BlogConfigs.Attach(blog); var stateEntry = ((IObjectContextAdapter)context).ObjectContext. ObjectStateManager.GetObjectStateEntry(blog); stateEntry.SetModifiedProperty("LastUpdated"); context.SaveChanges(); } } EF生成的SQL语句如下: exec sp_executesql N’update [dbo].[blog_Config] set [LastUpdated] = @0 where ([BlogID] = @1) ',N’@0 datetime2(7),@1 int',@0=’2011-04-06 14:12:28.2129938′,@1=0 […]
View Details今天谈谈在.net中读写config文件的各种方法。 在这篇博客中,我将介绍各种配置文件的读写操作。 由于内容较为直观,因此没有过多的空道理,只有实实在在的演示代码, 目的只为了再现实战开发中的各种场景。希望大家能喜欢。 通常,我们在.NET开发过程中,会接触二种类型的配置文件:config文件,xml文件。 今天的博客示例也将介绍这二大类的配置文件的各类操作。 在config文件中,我将主要演示如何创建自己的自定义的配置节点,而不是介绍如何使用appSetting 。 请明:本文所说的config文件特指app.config或者web.config,而不是一般的XML文件。 在这类配置文件中,由于.net framework已经为它们定义了一些配置节点,因此我们并不能简单地通过序列化的方式去读写它。 config文件 – 自定义配置节点 为什么要自定义的配置节点? 确实,有很多人在使用config文件都是直接使用appSetting的,把所有的配置参数全都塞到那里,这样做虽然不错, 但是如果参数过多,这种做法的缺点也会明显地暴露出来:appSetting中的配置参数项只能按key名来访问,不能支持复杂的层次节点也不支持强类型, 而且由于全都只使用这一个集合,你会发现:完全不相干的参数也要放在一起! 想摆脱这种困扰吗?自定义的配置节点将是解决这个问题的一种可行方法。 首先,我们来看一下如何在app.config或者web.config中增加一个自定义的配置节点。 在这篇博客中,我将介绍4种自定义配置节点的方式,最终的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MySection111" type="RwConfigDemo.MySection1, RwConfigDemo" /> <section name="MySection222" type="RwConfigDemo.MySection2, RwConfigDemo" /> <section name="MySection333" type="RwConfigDemo.MySection3, RwConfigDemo" /> <section name="MySection444" type="RwConfigDemo.MySection4, RwConfigDemo" /> </configSections> <MySection111 username="fish-li" url="http://www.cnblogs.com/fish-li/"></MySection111> <MySection222> <users username="fish" password="liqifeng"></users> </MySection222> <MySection444> <add key="aa" value="11111"></add> <add key="bb" value="22222"></add> <add key="cc" value="33333"></add> </MySection444> <MySection333> <Command1> <![CDATA[ create procedure ChangeProductQuantity( @ProductID int, @Quantity int ) as update Products set Quantity = @Quantity where ProductID = @ProductID; ]]> </Command1> <Command2> <![CDATA[ create procedure DeleteCategory( @CategoryID int ) as delete from Categories where CategoryID = @CategoryID; ]]> </Command2> </MySection333> </configuration> |
同时,我还提供所有的示例代码(文章结尾处可供下载),演示程序的界面如下: config文件 – Property 先来看最简单的自定义节点,每个配置值以属性方式存在:
1 |
<MySection111 username="fish-li" url="http://www.cnblogs.com/fish-li/"></MySection111> |
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MySection1 : ConfigurationSection { [ConfigurationProperty("username", IsRequired = true)] public string UserName { get { return this["username"].ToString(); } set { this["username"] = value; } } [ConfigurationProperty("url", IsRequired = true)] public string Url { get { return this["url"].ToString(); } set { this["url"] = value; } } } |
小结: 1. 自定义一个类,以ConfigurationSection为基类,各个属性要加上[ConfigurationProperty] ,ConfigurationProperty的构造函数中传入的name字符串将会用于config文件中,表示各参数的属性名称。 2. 属性的值的读写要调用this[],由基类去保存,请不要自行设计Field来保存。 3. 为了能使用配置节点能被解析,需要在<configSections>中注册: <section name="MySection111" type="RwConfigDemo.MySection1, RwConfigDemo" /> ,且要注意name="MySection111"要与<MySection111 ….. >是对应的。 说明:下面将要介绍另三种配置节点,虽然复杂一点,但是一些基础的东西与这个节点是一样的,所以后面我就不再重复说明了。 config文件 – Element 再来看个复杂点的,每个配置项以XML元素的方式存在:
1 2 3 |
<MySection222> <users username="fish" password="liqifeng"></users> </MySection222> |
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class MySection2 : ConfigurationSection { [ConfigurationProperty("users", IsRequired = true)] public MySectionElement Users { get { return (MySectionElement)this["users"]; } } } public class MySectionElement : ConfigurationElement { [ConfigurationProperty("username", IsRequired = true)] public string UserName { get { return this["username"].ToString(); } set { this["username"] = value; } } [ConfigurationProperty("password", IsRequired = true)] public string Password { get { return this["password"].ToString(); } set { this["password"] = value; } } } |
小结: 1. 自定义一个类,以ConfigurationSection为基类,各个属性除了要加上[ConfigurationProperty] 2. 类型也是自定义的,具体的配置属性写在ConfigurationElement的继承类中。 config文件 – CDATA 有时配置参数包含较长的文本,比如:一段SQL脚本,或者一段HTML代码,那么,就需要CDATA节点了。假设要实现一个配置,包含二段SQL脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<MySection333> <Command1> <![CDATA[ create procedure ChangeProductQuantity( @ProductID int, @Quantity int ) as update Products set Quantity = @Quantity where ProductID = @ProductID; ]]> </Command1> <Command2> <![CDATA[ create procedure DeleteCategory( @CategoryID int ) as delete from Categories where CategoryID = @CategoryID; ]]> </Command2> </MySection333> |
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public class MySection3 : ConfigurationSection { [ConfigurationProperty("Command1", IsRequired = true)] public MyTextElement Command1 { get { return (MyTextElement)this["Command1"]; } } [ConfigurationProperty("Command2", IsRequired = true)] public MyTextElement Command2 { get { return (MyTextElement)this["Command2"]; } } } public class MyTextElement : ConfigurationElement { protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey) { CommandText = reader.ReadElementContentAs(typeof(string), null) as string; } protected override bool SerializeElement(System.Xml.XmlWriter writer, bool serializeCollectionKey) { if( writer != null ) writer.WriteCData(CommandText); return true; } [ConfigurationProperty("data", IsRequired = false)] public string CommandText { get { return this["data"].ToString(); } set { this["data"] = value; } } } |
小结: 1. 在实现上大体可参考MySection2, 2. 每个ConfigurationElement由我们来控制如何读写XML,也就是要重载方法SerializeElement,DeserializeElement config文件 – Collection
1 2 3 4 5 |
<MySection444> <add key="aa" value="11111"></add> <add key="bb" value="22222"></add> <add key="cc" value="33333"></add> </MySection444> |
这种类似的配置方式,在ASP.NET的HttpHandler, HttpModule中太常见了,想不想知道如何实现它们? 代码如下: 小结: 1. 为每个集合中的参数项创建一个从ConfigurationElement继承的派生类,可参考MySection1 2. 为集合创建一个从ConfigurationElementCollection继承的集合类,具体在实现时主要就是调用基类的方法。 3. 在创建ConfigurationSection的继承类时,创建一个表示集合的属性就可以了,注意[ConfigurationProperty]的各参数。 config文件 – […]
View Details在ASP.NET这样的Web应用中,Session是用来保存用户状态的常用手段,不过由于服务器内存空间是有限的,所以Session过期时间设置是很有必要的。在ASP.NET中如何设置Session的过期时间呢,很简单,修改web.config配置。 具体修改方法如下,在web.config中进行如下配置 1 2 3 <system.web> <sessionState mode="InProc" timeout="30"/> </system.web> 在这里指的是Session过期时间为30分钟。也就是说30分钟后如果当前用户没有操作,那么Session就会自动过期了。 from:http://www.cnblogs.com/sjrhero/archive/2010/10/15/1852449.html
View Details