MVC项目综述

1 创建MVC项目

 

在VS2010中,使用FIle->New Project,在Visual C#下选择Web菜单,创建MVC 4项目

点击OK后,会弹出选择模板对话框。Empty模板创建简单的空项目结构,而Internet Application模板提供基础的布局和验证。Intranet Application模板和Internet Application相似,但是使用Windows身份验证。这里我们选择Internet Application。 同时我们也可以选择视图引擎,从MVC3 开始引入了Razor,同样也可以使用Web Forms(MVC 1,2中的默认选项)

项目创建完成后结构如下:

  • App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据。
  • Content :这个目录是建议用来存放一下资源文件的。例如CSS、JS、图片等等。当然你不愿意的话,完全可以不放到这里来。
  • Controllers :这个目录是建议将Controller类都放到这里来,方便管理。Controller类的命名必须以Controller结尾,例如一个名为Home的Controller则要命名为HomeController。
  • Models :这个目录是建议用来存放你的业务实体、数据访问层代码的类的。当然,更好的做法我觉得应该是将Models独立为一个类库。
  • Views :在默认情况下,所有的view文件都必须放到这个目录下来,每一个Controller对应一个子目录,而且子目录的命名必须以Controller的命名一样。例如,HomeController的view就应该放到Home子目录中。我们见到Views目录下还有一个Shared的子目录,这个子目录是用于存放一些共享的view的,例如Error.aspx和Site.Master。Controller在Views\ControllerNmae 中找不到指定的view的时候,会到Shared中去寻找。

核心DLL:

System.Web.Routing :URL路由。将一个URL路由到对应的Controller上靠的就是这个。是在HttpModule里面处理的。

System.Web.Extensions :这个是ASP.NET AJAX的。

System.Web.Mvc: ASP.NET MVC最主要的程序集。在CodePlex上放出源代码的就是这个DLL。

System.Web.Abstractions :这个程序集是一些相关的基类来的。例如HttpContextBase、HttpRequestBase 等等。

 

2 控制器 Controller

MVC框架中,控制器处理用户请求,将用户请求的URL路由,分发到控制器中的相关动作方法(actions)。控制器继承自Controller类,命名以Controller结尾。我们看一下项目中生成的“HomeController”:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication5.Controllers
{
    //继承自COntroller
    public class HomeController : Controller
    {
        //动作方法,并且返回ActionResult
        public ActionResult Index()
        {
            //向视图传递的数据
            ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";

            //指明要渲染的视图
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

该控制器中有三个动作方法,Index,About,Contact。因为该控制器命名为HomeController,我们可以分别通过路由: /Home/Index, /Home/About, /Home/Contact来访问。例如:我们在浏览器中输入http://localhost:4784/Home/Contact就可以访问控制器中的Contact方法。

 

3路由 Routes

 

MVC框架是如何将URL映射到指定控制器中的动作方法上的呢?在Global.asax文件中具有RegisterRoutes方法,该方法定义了URL模式映射到控制器或动作方法的路由。

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

在项目的App_Start目录下,查看路由配置文件Routconfig.cs

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
           //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件 routes.IgnoreRoute(
"{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); routes.MapRoute( name: "Default", //1 路由名称 url: "{controller}/{action}/{id}", //2 URL 模式 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } //3 路由默认值 ); } }

每一个路由都有

  • 路由名称
  • URL模式
  • 可选的默认值

到一个请求到达时,符合规则的URl将会转向到指定的Controller和action上。当我们运行项目时,默认的路劲/,因此此时访问的是: 控制器:“Home”, 动作方法:“Index”,“id”属性被忽略。

 

4 ViewBag 向视图传递数据

 

我们回过去看HomeController,Index方法中有两行代码

           //向视图传递的数据
            ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";

            //指明要渲染的视图
            return View();

第一行代码向ViewBag赋值一个字符串,第二行告诉框架需要渲染的视图。ViewBag它主要是为了从Controller到view进行传值用的,类似有所使用的ViewData[] 字典类。对于ViewBag是如此的强大,意味着你能动态的set/get  值,增加任何数量的的额外字段而不需要强类型的检测。如下,我们向ViewBag添加了一个时间属性。

 public ActionResult Index()
        {
            //向视图传递的数据
            ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";
            //动态添加一个时间属性
            ViewBag.CurrentDate = DateTime.Now;
            //指明要渲染的视图
            return View();
        }

5 View 视图

return View();方法告诉MVC框架需要渲染一个视图,但是我们并没有告诉框架视图的名称,这种情况下,MVC就会在Views目录下控制器名称对应的文件夹(Home)下动作方法(Index)对应的视图Index.cshtml
@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
            </hgroup>
            <p>
                To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">
                    http://asp.net/mvc</a>. The page features <mark>videos, tutorials,
                        and samples</mark> to help you get the most from ASP.NET MVC. If you have
                any questions about ASP.NET MVC visit <a href="http://forums.asp.net/1146.aspx/1?MVC"
                    title="ASP.NET MVC Forum">our forums</a>.
            </p>
        </div>
    </section>
}

Index View同时包含C#代码和Html标签。@{ ViewBag.Title = "Home Page"; }设置了页面标题。 在<h2/>标签中显示了控制器的Index动作方法中的Message属性。

 

至此,已经展示了MVC如何接收URL并转向到指定的控制器,控制器如何向视图传递数据,然后渲染视图传回客户端。

posted @ 2012-07-02 09:31  Johnny Yan  阅读(5164)  评论(0编辑  收藏  举报