摘要:
通过扩展方法,可以让CheckBox水平排列,生成CheckBoxList,正如"MVC扩展生成CheckBoxList并水平排列"一文。但,如何对生成的CheckBoxList验证呢?比如要求至少勾选一项: □ 思路 在强类型视图页中,@Html.EditorFor(model => model.属性, "模版名称", new{ ...路由数据...}),模版名称对应View... 阅读全文
摘要:
在"MEF(Managed Extensibility Framework)使用全部扩展组件"中,客户端应用程序调用了所有的扩展组件,而且如果有新的扩展组件加入,必须先关闭程序,再重新启动才可以调用所有组件。 本篇体验使用MEF的ExportMetadata特性,有选择性地使用某些扩展组件,使用Lazy,让客户端程序延迟动态加载组件,即使不关闭应用程序,也能调用所有组件。 ●... 阅读全文
摘要:
MEF(Managed Extensibility Framework),所在命名空间是System.ComponentModel.Composition.dll。简单来说,MEF是将符合约定(一般是实现接口)的组件的Parts(类、方法和属性可看作是Part)标记为Export特性,再把这些组件放... 阅读全文
摘要:
当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托。 通过委托构造函数或委托变量把方法赋值给委托 private delegate double DiscountDelegate(double discount); private static DiscountDelegate dd = getDiscountRate;... 阅读全文
摘要:
需要通过jquery传递到控制器方法的Model为: public class Person { public string Name { get; set; } public int Age { get; set; } }使用下面这个类的Message属性装载成功或错误信息,并最终转换成json格式返回给视图: ... 阅读全文
摘要:
Student类有集合属性Courses,如何把Student连同集合属性Courses传递给控制器方法? public class Student { public string StudentName { get; set; } public IList Courses { get; set; } } p... 阅读全文
摘要:
在"MVC批量更新,可验证并解决集合元素不连续控制器接收不完全的问题"中,当点击"添加"按钮的时候,通过部分视图,在界面上添加新行。本篇体验使用jQuery Template,在界面上添加新行。 □ 思路 →引用jQuery Template所需要的js文件:jquery.tmpl.min.js →在中生成模版内容,里面包含占位符 →点击添加按钮的时候,把模版内容追加到界面上... 阅读全文
摘要:
在"MVC批量添加,增加一条记录的同时添加N条集合属性所对应的个体"中,有2个问题待解决: 1、由jquery动态生成了表单元素,但不能实施验证。 2、一旦集合元素不连续,控制器就无法接收到完整的数据。 批量添加或更新,控制器能接收的方式,大致有2种: Category.Name Category.Products[0].Name Category... 阅读全文
摘要:
□ 重写前 通常这样写: @Html.DropDownListFor(m => m.DelFlag,(List □ 重写后 重写name属性: @Html.DropDownListFor(m => m.DelFlag,(List 注意: 如果写成new {id="dd",name="myName"},则不会对name属性重写。 对Html.DropDow... 阅读全文
摘要:
从控制器传递多个Model到视图,可以通过ViewData, ViewBag, PartialView, TempData, ViewModel,Tuple等,本篇逐一体验。本篇源码在github。 在视图页面,下拉框选择课程触发事件,分别显示老师课程表、学生上课表,如图: 相关的Model: public class Course { ... 阅读全文
摘要:
有时候,我们希望2个属性中,至少有一个是必填,比如: using Car.Test.Portal.Extension; namespace Car.Test.Portal.Models { public class Person { public int Id { get; set; } public string Tele... 阅读全文
摘要:
上一篇中,使用客户端jJSAjaxFileUploader插件实现单文件异步上传,本篇实现多文件异步上传。本篇源码在github,先看效果:● 上传文件显示进度条。 ● 停止上传按钮和关闭缩略图按钮。 ● 限制上传文件的类型。 ● 限制上传文件的尺寸。 ●同时上传多个文... 阅读全文
摘要:
前段时间做了几个关于图片、文件上传的Demo,使用客户端Query-File-Upload插件和服务端Badkload组件实现多文件异步上传,比如"MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传",就Demo而言,效果还算不错,但... 阅读全文
摘要:
类别中包含一个产品的集合属性,如何向数据库添加一条类别记录的同时,添加任意多个产品。 public class Product { [DisplayName("产品名称")] public string Name { get; set; } } public class Category { ... 阅读全文
摘要:
□ 只读属性public class Example { string name; public string Name { get {return name;} } }□ 只写属性public class Example { string ... 阅读全文
摘要:
关于缓存,先前尝试了: ● 在"MVC缓存01,使用控制器缓存或数据层缓存"中,分别在控制器和Data Access Layer实现了缓存 ● 在"MVC缓存02,使用数据层缓存,添加或修改时让缓存失效"中也尝试了在添加或修改时让缓存失效 本篇,要尝试的是视图缓存。 □ 思路 1、缓存的载体是什么? 在Data Access Layer中,缓存是围绕System.... 阅读全文
摘要:
报错:具有键"..."的ViewData项属于类型"...",但它必须属于类型"IEnumerable" □ 背景分析 MVC控制器中有2个方法,一个是用来显示添加视图,另一个是用来接收添加数据。 public ActionResult Add() { ViewData["o"] = 类型为List的集合实例; return View(); } [... 阅读全文
摘要:
Newtonsoft.Json报错:未能加载文件或程序集"..."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 □ 背景分析 在帮助类库中使用了Newtonsoft.Json的最新版本,在主程序中,引用了Newtonsoft.Json的某个版本,估计是因为2个版本不一致而引发的错误。 在帮助类中,右键Newtonsoft.Json: 在主程序中,右键... 阅读全文
摘要:
散列运算 mscorlib.dll下的System.Security.Cryptography下: 抽象类HashAlgorithm 抽象类MD5 MD5CryptoServiceProvider SHA1 SHA1CryptoServiceProvider密封类:调用Windows Crypto API... 阅读全文
摘要:
继上一篇"MVC无限级分类01,分层架构,引入缓存,完成领域模型与视图模型的映射",本篇开始MVC无限级分类的增删改查部分,源码在github。 显示和查询使用datagrid显示数据,向控制器发出请求的时候,datagrid默认带上了当前页page和页容量rows这2个参数。如果项目中的其它界面也... 阅读全文
摘要:
本系列将使用zTree来创建、编辑关于品牌、车系、车型的无限级分类,使用datagrid显示,源码在github。先上最终效果:datagrid显示所有记录、分页,提供添加、修改、删除按钮,并提供简单搜索: 创建分类,弹出模态窗口,zTree显示所有分类,点击勾选按钮或节点,所选节点名称显示到文本框... 阅读全文
摘要:
对消息的接收方来说,安全的交流方式需要同时满足3个条件: 1、完整性:消息在传输途中没有被篡改过,即消息是完好无损的。 2、保密性:接收放可以理解或解密来自发送方的信息。(不保证第三方无法获得,但保证第三方无法解密) 3、可认证性:确定消息确实是由预期的发送方发送。 散列运算 散列运算也叫哈希运算,对消息进行散列运算可以获得消息的摘要(Digest),也叫哈希... 阅读全文
摘要:
!!是逻辑"非非",即是在逻辑“非”的基础上再"非"一次。通过!或!!可以将很多类型转换成bool类型,再做其它判断。 应用场景:判断一个对象是否存在 假设有这样一个json对象:{ color: "#E3E3E3", "font-weight": "bold" },需要判断是否存在,用!!再好不过。 如果仅仅打印对象,无法判断是否存在: var temp ... 阅读全文
摘要:
什么是序列化和反序列化: 将对象及其状态保存起来,通常是保存到文件中,叫序列化。 将文件还原为对象,叫反序列化。序列化和反序列化的接口和帮助类: ● 接口IFormatter object Deserialize(Stream serializactionStream) void Serialize(Stream serializationStream, object graph) ● System.Runtime.Serialization.Formatters.Binary下的BinaryFormatter,将对象序列化成二进制 ● System.R... 阅读全文
摘要:
报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"。 出错语句停留在:DataContext.Entry(entity).State = EntityState.Modified; 从语法上看没有什么错误。DataContext是在Model层通过添加edmx自动生成的,而出错语句所在的数据层... 阅读全文
摘要:
本篇将通过3种方式,把枚举项上的自定义属性填充到下拉框: 1、通过控制器返回List如果枚举的项发生变化怎么办?比如: public enum StatusEnum { Enable = 0, Disable = 1, NeverComeback = 2 }如果修改每一页的代码,显然是不合理的。最理想的做法是:为每一个枚举项打上属性,显示的时候直接读取... 阅读全文
摘要:
使用流读取、写入文件 使用流把文件读取到字节数组: //FileMode.Create, FileMode.Append //FileAccess.Write, FileAccess.ReadWrite //FileMode和FileAccess搭配使用,如果第二个参数FileMode.Appden写追加,第三个参数FileAccess.Read只读... 阅读全文
摘要:
使用"EF Model First",我们可以很直观地在edmx文件中创建数据模型,并根据模型生成数据库,整个过程快速而高效。可当数据库中有了一定的数据量,同时,可能需要对模型中字段、表、关系等进行更新,如何把模型中的变化映射到已经有一定数据量的数据库呢? 本篇使用"EF Model First"创建1对多,多对多关系表,接着体验如何把模型的更新映射到数据库。edmx数据模型在如下几个方面... 阅读全文
摘要:
为什么需要强名称程序集和数字签名 有一个类库项目ClassLib,对应的程序集是ClassLib.dll。当前控制台项目引用ClassLib.dll程序集的方式有2种: 1、通过添加现有项目 文件→添加→现有项目→选择"ClassLib.csproj",把项目引入到当前控制台所在解决方案→右键控制台项目"引用"→添加引用→解决方案→项目→选择ClassLib项目 2、通... 阅读全文
摘要:
在使用SQL Server 2008为某个表添加列的时候出现启用了"阻止保存要求重新创建表的更改问题的设置方法..."报错: 解决方法: 工具--选项--Designers--表设计器和数据库设计器,把"阻止保存要求重新创建表的更改"勾选去掉。 阅读全文
摘要:
本篇主要涉及: 1、先判断文件夹是否存在,再决定是否创建文件夹 2、先判断文件是否存在,再决定是否创建文件 3、创建文件之前计算文件夹总大小,如果大小超过规定,放弃创建文件 先判断文件夹是否存在,再决定是否创建文件夹 如果文件夹不存在,就创建新文件夹。 如果文件夹已存在,提示已经存在。 using System.IO; namespace ... 阅读全文
摘要:
程序集资源可以看作是Dictionary的字节数组。可以将资源直接嵌入到程序集中;也可以将资源单独嵌入到一个程序集,然后由主程序集引用包含资源的程序集,包含资源的程序集也叫卫星程序集(Satellite Assembly)。一个运用场景是:当开发多语言版本应用程序时,把不同的语言包作为资源签入到各个卫星程序集中,供主程序集调用。 通过VS可视化界面把资源嵌入到程序集,并浏览资源文件 ... 阅读全文
摘要:
在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间。但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据。 □ 思路 1、缓存是以键值存放的,在创建缓存的时候,先把IDictionary作为缓存内容存储,int为T的主键。 2、EF上下文保存的时候时候把变化保存到数据库,并更新缓存中的内容。 ● 先找出上下文中状态为added或modifi... 阅读全文
摘要:
关于比较对象,在"06判等对象是否相等"中大致可以总结为: 关于比较方法: ● 实例方法Equals(object obj)既可以比较值类型,也可以比较引用类型 ● 静态方法Equals(object objA, object objB),比较值类型 ● 静态方法ReferenceEquals(object objA, object objB),比较引用类型 ● 比... 阅读全文
摘要:
投影 □ 遍历数组索引,Select获取 int[] indexes = {0, 2}; string[] strs = {"a", "b", "c", "d"}; var result = from i in indexes select strs[i]; ... 阅读全文
摘要:
对一些浏览频次多、数据量大的数据,使用缓存会比较好,而对一些浏览频次低,或内容因用户不同的,不太适合使用缓存。 在控制器层面,MVC为我们提供了OutputCacheAttribute特性;在数据层使用缓存,用System.Runtime.Caching是不错的选择。 控制器层面使用OutputCacheAttribute缓存 □ OutputCacheAttribute默认... 阅读全文
摘要:
有时候需要查看程序集的一些元数据信息,比如token, version等,通过ILDASM反编译程序集可以查到。 1、在F盘m文件夹中创建一个MyFirst.txt文件: using System; namespace HelloWorld { public class Program { static void Main(strin... 阅读全文
摘要:
MVC控制器中,经常使用Newtonsoft.Json把对象序列化成json字符串传递到前端视图。当对象中有DateTime类型的属性时,前后台如何处理才能把DateTime类型转换成想要的格式呢? 有这样的一个类具有DateTime类型属性: using System; namespace MvcApplication1.Models { public cla... 阅读全文
摘要:
当想通过Html.EditorFor()给文本框加上maxlength,placeholder等属性的时候,发现Html.EditorFor()没有提供可直接加上这些属性的重载方法,如何做到呢? □ 思路 1、Html.EditorFor()有一个重载方法如下: 也许,可以把需要给文本框加上的属性(maxlength, placeholder,etc),封装成一个匿名对象,作... 阅读全文
摘要:
IEnumerable返回其它集合类型 ToArray() ToList() ToDictionary() ToLookUp() 返回集合中的元素 □ ElementAt()返回某个位置上的元素 int[] arr = {1, 2}; int item = arr.ElementAt(0); ... 阅读全文