摘录于Pro ASP.NET MVC3 Framework一书:
一. Web Form的缺点
1. view state weight: view state 中保存的数据在每次HTTP请求中来回传递,且包含的数据量可以达到很大,导致用户响应时间比较慢,增加了带宽要求
2.页的生命周期相当复杂
3.html的访问性更差 服务器控件最终以纯HTML形式呈现,但往往不是以WEB标准呈现的,导致不能很好的利用CSS,且服务器控件呈现生成不可预知、复杂的ID,导致用JS很难访问到
4.紧密的架构不适合用unit testing
二、DI(dependency inject)依赖注入
减少组件的耦合度,用到的容器为Ninject
public interface IA
{
void fun_A(String str);
}
public class A : IA
{
public void fun_A(String str)
{
Console.WriteLine("{0}", str);
}
}
public interface IB
{
void fun_B();
}
public class B : IB
{
private IA ia;
public B(IA iaa)
{
ia = iaa;
}
public void fun_B()
{
ia.fun_A("test in interface IA");
}
}
public class C
{
private IB ib;
public C(IB ibb)
{
ib = ibb;
}
public void GoTest()
{
ib.fun_B();
}
}
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<IB>().To<B>();
kernel.Bind<IA>().To<A>();
IB b = kernel.Get<IB>();
C cc = new C(b);
cc.GoTest();
Console.ReadKey();
}
}
//类C 依赖于接口IB, 实现IB的类B又依赖于接口IA, 也可以说是:类C依赖于接口IB,接口IB又依赖于IA,这样就形成了一条依赖链,用DI容器可以自动完成相互依赖的接口的实现类的实例的创建【面向接口编程】
//用DI容器后,它会自动去理清这条链,然后创建相应的实现类实例,并传给相应的构造函数,【也叫构造函数注入】
//依赖注入有三种方式:A.Constructor Injection B.Setter Injection C.Interface Injection
三、Layout
如果不想引用母版页,则必须@{Layout = null;}
如果没有这样指明,则默认为引用ViewStart.cshtml作为母版,而ViewStart.cshtml引用的是_Layout.cshtml,
所以没有指明的情况下,则是引用_Layout.cshtml作为母版的。
四、Html.RenderPartial与Html.RenderAction
//这两个方法都是用来在界面上嵌入用户控件的
(1)Html.RenderPartial("LogOnUserControl");
//LogOnUserControl是一个partial view名,也就是在这个view中定义一个用户控件,这个view必须放在调用者同一目录下,也可以放在View/Shared中。可以看出,这个方法是依赖于一个partial view的
(2)Html.RenderAction
//从方法名上就可以看出这个方法依赖于Action【调用某个Action对应的View】, 例如:
Html.RenderAction("Menu", "Nav");
//Menu是Action名,此时会调用Menu对应的View,Nav是这个Action所在的Controller名