这些理由,让我喜欢上了Mvc

最近的一段时间,让我喜欢上了mvc,对mvc又是一番见解,佩服着微软给.net带来的技术,mvc,ef

1、创建项目内置了Bootsrap

Bootsrap是一个响应式的UI界面库,能快速的搭建响应式界面,如果没有美工,对界面要求不是很高的话完全可以直接作用,很方便。

Bootsrap的推荐网站

http://getbootstrap.com/

http://www.bootcss.com/

2、url路由控制灵活,对seo友好

  1. public class RouteConfig
  2. {
  3. public static void RegisterRoutes(RouteCollection routes)
  4. {
  5. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  6. routes.MapRoute(
  7. name: "Default",
  8. url: "{controller}/{action}/{id}",
  9. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  10. );
  11. }
  12. }

这个是RouteConfig注册默认路由。这个类的静态方法RegisterRoutes是在网站启动的时候调用的。

MVC不像webform那样,一个动态url地址是对应到一个本地的一个aspx文件,而mvc是对应一个Controller(控制器)的里面的一个Action(public方法)。mvc是对应的”/Home/About“对应的就是HomeController的名字为About的Action。这种url地址到Controller的Action的对应关系你完全可以按照你的要求设置,甚至可以配置成.html结尾的伪静态

我之前写的一篇文章可以看一下”自定义route路由机制

3、视图引擎的灵活

默认情况下创建mvc视图文件.cshtml会自动把这些同一个Controller的Action的视图放在一个文件夹。

对应视图文件结构

mvc视图自带的视图是razor引擎,可以强类型绑定视图,安全,性能方面都有保证。

要指定视图对应的model类型很简单

在Contoller里面用return View(xx)

xx为对应的一个model对象。

视图使用:

@model xxx.Models.xx

这样视图就可以用@Model.字段绑定了。

视图可以像可以定义一个共用的部分Layout(就像Webform的master母版页),头部、页脚、菜单导航等这些共用的html都可以放在Layout里面,对于局部多个地方相同的html,可以用@Html.Action("actionName","controllerName")方法来绑定一个局部视图(就像Webform的用户控件)

Action对应的局部视图也可以定义输出缓存OutputCache单位是分钟,这样下次请求直接在缓存中取出来,提高了程序的效率。 一般对变化不频繁的Action我都这样会加上缓存。加上[ChildActionOnly]表示只能通过视图来引用,不能直接在浏览器访问。

3.1、自定义视图引擎

这样可以实现mvc视图主题,网站可以制作不同风格的主题,每个主题分别绑定视图就可以了。

要使自定义的视图引擎生效还需要在Global.asax加入下面的代码把默认视图引擎禁用。

  1. ViewEngines.Engines.Clear();
  2. ViewEngines.Engines.Add(new CustomRazorViewEngine());

4、Model绑定

Action的参数可以是一个个单独的参数,也可以是一个model对象,mvc可以从请求中获取到参数绑定相应的字段到model中去。这样实现了表单提交的时候,自动装配的功能,而不需要类似这样:Request.Form["xx"]获取值赋值给model。

mvc默认的参数绑定是按照以下顺序的。

Request.Form=》RouteData.Values=》Request.QueryString=》Request.Files

假设Action的一个参数id,会从下面按顺序获致id的值,一旦找到就不会再往下面寻找。

1. Request.Form["id"]

2. RouteData.Values["id"]

3. Request.QueryString["id"]

4. Request.Files["id"]

实践开发过程中的一个添加功能,绑定一个model对象,视图代码:

@model MvcModels.Models.Person
@{
ViewBag.Title = "CreatePerson";
}
<h2>Create Person</h2>
@using(Html.BeginForm()) {
<div>@Html.LabelFor(m => m.PersonId)@Html.EditorFor(m=>m.PersonId)</div>
<div>@Html.LabelFor(m => m.FirstName)@Html.EditorFor(m=>m.FirstName)</div>
<div>@Html.LabelFor(m => m.LastName)@Html.EditorFor(m=>m.LastName)</div>
<div>@Html.LabelFor(m => m.Role)@Html.EditorFor(m=>m.Role)</div>
<button type="submit">Submit</button>
}

后台代码

[HttpPost]
public ActionResult CreatePerson(Person model) {
return View("Index", model);
}
这样前台的表单的值会对应到model的相应的字段里面。当然也可以指定哪些字段要绑定

public ActionResult AddSummary(
[Bind(Include = "HomeAddress", Exclude = "Country")]AddressSummary summary)
{
//do something
return View(summary);
}

MVC的校验非常的好,自带非空检验,类型检验,也可以写复杂的正则表达式
[Requred]
Public string Name{get;set;}
以上表示Name字段必填。

4.1自定义Binder绑定

使用IModelBinder接口自定义一个购物车的Binder类

public class CartModelBinder : IModelBinder
{
private const string sessionKey = "Cart";
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
//从Session读取购物车对象
Cart cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
if (cart == null)
{
cart = new Cart();
controllerContext.HttpContext.Session[sessionKey] = cart;
}
return cart;
}
}

在Global.asax里面的Application_Start方法加入代码为Model绑定集合加入上面自定义的CartModelBinder类。

ModelBinders.Binders.Add(typeof(Cart), new CartModelBinder());

这样以后的Action的Cart对象如:

  1. public ViewResult Summary(Cart cart)
  2. {
  3. return View(cart);
  4. }

就会自动绑定,也就是从Session里面取key为Cart的对象。

5、控制器灵活

mvc的Controller拓展也很灵活

上面就是MVC框架程序的执行流程,上面图中的ControllerFactory,Controller,Action Invoker都可以完全自定义拓展。

我们创建的Controller是其实默认继承System.Web.Mvc.Controller的,这是一个抽象类,其实它为我们提供了很多基础实现

它的很多方法都定义为虚方法,所以如果我们要实现自己个性化的东西也可以重写里面的方法。

5.1、自定义一个ControllerFactory

using System;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.SessionState;
using ControllerExtensibility.Controllers;
namespace ControllerExtensibility.Infrastructure {
public class CustomControllerFactory: IControllerFactory {
public IController CreateController(RequestContext requestContext,
string controllerName) {
Type targetType = null;
switch (controllerName) {
case "Product":
targetType = typeof(ProductController);
break;
case "Customer":
targetType = typeof(CustomerController);
break;
default:
requestContext.RouteData.Values["controller"] = "Product";
targetType = typeof(ProductController);
break;
}
return targetType == null ? null :
(IController)DependencyResolver.Current.GetService(targetType);
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext
requestContext, string controllerName) {
return SessionStateBehavior.Default;
}
public void ReleaseController(IController controller) {
IDisposable disposable = controller as IDisposable;
if (disposable != null) {
disposable.Dispose();
}
}
}
}

CustomControllerFactory职责是根据请于的获取到路由信息来创建相应的Controller对象

要使自定义的CustomControllerFactory生效还需要在在Application_Start()方法中加入注册代码

  1. ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

6、AOP面向方面编程

Java的Spring框架的AOP(面向方面编程)很强大,AOP的优点是大大的降低了软件模块的耦合性,提高了代码的复用和维护性。

ASP.NET MVC有各种Filter过滤器,就相当于AOP的技术。可以把应用于身份验证,日志记录,异常处理,这样核心业务只关心自己的逻辑代码就是了,最后的代码不会参杂有业务代码身份验证、日志相关的代码。

我这之前写了一篇介绍mvc的aop文章,AOP实践--利用MVC5 Filter实现登录状态判断

7、IOC控制反转

.Net方面的IOC框架是也是不少的主流的有Autofac、Castle Windsor、Unity、Spring.NET、StructureMap、Ninject等。MVC使用这些框架也很好集成。有的都不用自己写IOC框架与MVC集成代码了。像Autofac有MVC5和MVC2、3、4都有现有集成代码,如下图。

直接安装就可以在自己的MVC项目中用了,如果你用的IOC框架没有在nuget中找到MVC集成包,自己写有也很容易。

具体请看我这前的文章IOC实践--用Autofac实现MVC5.0的IOC控制反转方法

8、单元测试容易

你可以不通过Web服务器IIS之类的来测试Action和Controller,利用moq框架很容易的就mock模拟出真实的Web请求。

mvc的Controller和Action方法都可以很方便的进行单元测试。

你如果要测试一个Action方法的返回值,你都可以不用解析任何的HTML的。 只需要监视Action的返回值ActionResult类型的对象。

不用模拟用户请求,MVC框架的model绑定对象,做为Action方法的参数,然后返回相应的结果 。最简单的测试就是你传入具体的参数直接调

Action方法,就可以了。比如要测试一个Action是真能返回一个指定的View

  1. public ViewResult Index() {
  2. return View("Homepage");
  3. }

测试代码:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ControllersAndActions.Controllers;
using System.Web.Mvc;
namespace ControllersAndActions.Tests {
[TestClass]
public class ActionTests {
[TestMethod]
public void ViewSelectionTest() {
// 创建要测试的 Controller
ExampleController target = new ExampleController();
// 调用Action
ViewResult result = target.Index();
// 判断测试结果
Assert.AreEqual("Homepage", result.ViewName);
}
}
}

9、开源

MVC是开源的框架,而NuGet是一个VS很有用的一个包管理工具,上面有很多有用的类库,搜mvc出现下面的结果。

可以看到很多有用的类库,分页(PagedList.Mvc),Grid.Mvc。

9、entityframework完美配合

MVC5项目添加Controller可以选择”包含视图的MVC5控制器(使用Entity Framework)“,这样一个Model的增、删、改、查这些相关的View和Action自动给你生成好了,只需要根据自己需要改一下基本上就能用了。这样大大的提高的开发速度,对于开发管理后台这个太好用了。

10、总结

总结:我之前一直都觉得.net是入门比较容易,因为很多东西微软都给你封装好了,要成为高手比较难,不像java的好多开源的框架,从中可以学到好多的软件架构和设计模式这类的东西,例如,面向接口编程,AOP,IOC这类的。但是伴随着.Net的相关东西开源,比如MVC、EF、甚至现在.NET Framework也开源了,研究的越来越多,这些.net现在也可以,我上面写就可以看到MVC的每个部分都很灵活,完全可以根据自己的需要重写,订制。建议想成为高手或架构师,完全有必要仔细研究MVC的源码和原来,因为从里面可以学到很多设计模式、软件架构、软件设计相关的技巧,对于提升我们的技术能力很有帮助。

时间: 2024-10-06 02:59:21

这些理由,让我喜欢上了Mvc的相关文章

如果你喜欢上了一个程序员小伙

程序员向来是善于幽默自嘲的群体,但从某种程度上影响了咱程序员在广大女同胞心中的印象啊-- 于是写下此篇(有从别处看到的3句加进来的), 就算是为咱程序员做个广告--要是觉得有点过的程序员们,就把此文当作一个美好的目标吧---) ---------------------------------------------- 如果你喜欢上了一个程序员小伙,就不用再害怕电脑中病毒QQ被盗,因为他至少尝试过10款以上杀毒软件,他知道用那款占资源最少防毒效果最好的保护你的电脑. 如果你喜欢上了一个程序员小伙

告诉你我为什么不喜欢上互联网社交网站

我不上QQ空间有差不多快6年了吧?微博也不发了半年多了(但偶尔会看 不能与时代信息完全脱轨嘛(-?-;)而人人就在高一的时候注册过 发布过一条状态后就注销了 觉得没意思 我倒不是特地为了远离网络而远离 就突然的觉得没意思 说实话没有这些并没有感觉自己的生活失去了什么缺少什么 我还是觉得自己有点依赖社交网络 我最怵的一种人就是把自己的什么隐私都放上网的人 特别是一条状态朋友圈空间微博人人齐同步 我想大多数人喜欢把自己生活什么暴露出来都是觉得自己过于重要了 我觉得关闭掉这些挺好的 我也没有觉得跟身边

IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法

IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler” 解决方法如下: 以管理员运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regii

IIS上部署MVC网站,打开后ExtensionlessUrlHandler-4.0

IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误 IS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler” 解决方法如下: 以管理

Windows 7 IIS7.5上部署MVC实例

一.部署准备: 1.安装Microsoft .net FrameWork 4.0包 http://www.microsoft.com/zh-cn/download/details.aspx?id=17718 2.安装ASP.NET MVC 3.0 http://www.microsoft.com/en-us/download/details.aspx?id=4211 3.发布MVC网站应用程序(或将发布好的目录拷贝到IIS所在电脑) 二.IIS7.5部署 1. 修改ISAPI和CGI限制 如果

在IIS6上部署MVC站点,Nhiernate数据库底层

服务器环境要求: Windows 2003 server + IIS6.0 1.必须安装.net framework 4.0, MVC 2.最好能安装.net framework 的sp1, 我们服务器上装的是.net framework 3.5 sp1和mvc3. IIS站点配置 1. 添加站点, 在站点上右击“属性”,选择“主目录”选项卡, 点击“配置”按钮, 弹出一个窗口.目录浏览可以不用. 2.弹出一个窗口,选择“映射”选项卡, 首先看一下“应用程序扩展”列表中,是否存在扩展名为".mv

我已经喜欢上了Python

早就听说了Python语言,今天试了试,挺喜欢她了. Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ============================

Asp.net: WebForm基础上构建Mvc的方法

添加引用: System.Web.Routing System.Web.Abstractions System.Web.Mvc 添加文件夹: Controllers, Views,  Views / Shared 配置Web.config:是添加配置项,不是直接替换哦! < ?xml version="1.0"?> <configuration> <system.web> <compilation debug="false"

初识Winform , 还好没喜欢上控制台

虽然没听的太懂, 不过还是写点东西吧. 我呢, 就跟着这本书写了个学生管理系统 前面刚会了SQLserver, 所以这个学生管理系统需要连上数据库, 毕竟学了不用天诛地灭 既然需要连接数据库, 就要用到SqlConnection对象, 最好提炼到一个类里面:DBHelper 多说无益, 上代码: class DBHelper { //数据库连接字符 private string constr = @"Data source=.;initial catalog=MySchool;uid=sab;p