MVC一些知识点(不限于MVC,也有c#中的但是MVC常用的)
特性Attribute
特性就是类或方法名上方用中括号"[]"括起来的内容。创建自定义特性需要用到Attribute关键字,具体代码如下:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public sealed class MyStringLenthAttribute : Attribute { public MyStringLenthAttribute(string displayName, int maxLength) { this.MaxLength = maxLength; this.DisplayName = displayName; } //显示的名称,对外是只读的,所以不能通过可选参数来赋值,必须在构造函数中对其初始化。 public string DisplayName { get; private set; } //长度最大值,对外是只读的,所以不能通过可选参数来赋值,必须在构造函数中对其初始化。 public int MaxLength { get; private set; } //错误信息,标注时可作为可选命名参数来使用。 public string ErrorMessage { get; set; } //长度最小值,标注时可作为可选命名参数来使用。 public int MinLength { get; set; } }
第一行的代码表示这个特性只允许在属性和字段上使用
AttributeTargets的枚举值包含这些内容
[ComVisible(true)] [Flags] public enum AttributeTargets { Assembly = 1, Module = 2, Class = 4, Struct = 8, Enum = 16, Constructor = 32, Method = 64, Property = 128, Field = 256, Event = 512, Interface = 1024, Parameter = 2048, Delegate = 4096, ReturnValue = 8192, GenericParameter = 16384, All = 32767 }
扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型或修改原始类型。
第一次看到这个东西的时候,脑子里瞬间出现一个词“接口污染”写程序的时候经常遇到这个问题,抽象一些放到接口里不合适,因为有些方法不是所有实现类都用的到。具象一些貌似也不行,因为代码又耦合了,并且很容易就破坏的原有的面向对象关系,当然可以考虑再抽象出一个接口来,但是如果该接口只有一个方法,那么代码就成了为了对象而对象,并且也会降低代码的可读性,然后有强迫症的程序员就陷入了无限的纠结中。有了个这个玩意就爽了,可以在不改变原有类的情况下,增加所需要的方法。看看具体的代码实现
public static class Expand { //必须是静态方法,方法的参数以this开头,后面的类型(在这里是object,可以替换成任何我们想扩展的类)就是我们要扩展的类 public static int ConvertToInt(this object souce) { return Convert.ToInt32(souce); } }
调用的时候要按照动态方式调用。因为我扩展的是object类型,所有的类都继承自object,所以你会发现,现在任何一个类都有了ConvertToInt这个方法。
Razor语法
Razor语句都是以@符号开始的。通过@model可以实现强类型,一个好处是类型安全,一个好处特别明显,因为是强类型VS认识这个东西所以撸代码会有快感。
视图中的Model属性用于存放控制器(Controller)传递过来的model实例对象。
举例说明一下:
假如我有这样的一个实体类
public class Product { public int ProductID { get; set; } public string Name { get; set; } public string Description { get; set; } public decimal Price { get; set; } public string Category { set; get; } }
然后我在控制器里有这样的一个Action
public ActionResult Index() { //这个Product就是刚才说的那个实体类 //给对象赋值的过程就不写了。都一样 Product p = new Product(); return View(p); }
那么在视图页的第一行增加这段代码:@model 命名空间.xx.xx.Product,就可以使用Product里面的属性了
<h2>@model.Name</2>
ViewBag
用的时候和强类型是一样的。也是通过Razor语法来访问。@ViewBag.XXX
这个ViewBag挺有意思的。首先可以明确的是他是一个对象(至少看上去和用起来都像),既然是对象就有属性,但是ViewBag的属性是动态属性。什么意思?
看看上面写的Product这个类,如果我们在用的时候这样写肯定是报错的:p.city 因为没有city这个属性。但ViewBag不会。ViewBag的属性是用的时候才声明,这个地方和session很像,但是这个东西不是数组。ViewBag可以放任何东西。可以是值类型可以是引用类型。
_ViewStart.cshtml
打开我们的项目,找到Views这个文件夹打开它,在这个文件夹的根目录下你会发现一个名叫_ViewStart.cshtml的文件,打开他你会发现他里面只有一段话(自己写的不算)
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
这段代码没干啥就是把layout指向了一个地址。这个文件用来干嘛的呢?这是一个微软的一个约定(不需要编码、不需要配置的配置),以前写web程序的时候我们为了快速开发前端页面会用母版页,然后其他的页面都会去套用这个母版页。既然这样微软就帮我做了一个事!就是这个_viewStart.cshtml他来引用母版页,然后所有的页面都会按照约定自动引用他。除非我们显示的告诉项目不需要引用。只需要在不需要引用的界面上写这样的一段话
@{
Layout = null;
}
ASP.NET MVC 缓存
缓存的级别分为:Control缓存Action缓存和配置文件缓存
注:当Control与Action都应用了缓存时,以Action的缓存为主。(缓存换个地方写)
浙公网安备 33010602011771号