• 通过一个简单的文章系统学习MVC3+Linq搭建网站项目文件结构介绍(3)


    通过一个简单的文章系统学习MVC3+Linq搭建网站:

    (1)数据库建模 (2012-03-23 12:10)

    (2)如何利用系统自带的用户系统 (2012-03-28 22:41)

    (3) 项目文件结构介绍 (2012-04-04 15:41)

    源码   数据库创建sql   本示例DEMO

     
    下图是我们的项目资源文件,我大概标注了它们各自的角色作用。

    下面我分别对他们进行一些简单的说明:

    2,5,:存放一些网站资源文件,js等。

    1,一些常用工具类,比如json处理,分页类等。

    7,Global.asax MVC中以前那套基于文件目录的URL没有了,MVC中的url则是基于我们的控制器Controller,以及控制器里的Action方法以及参数。我们把这套模式叫做路由,那么,有关路由的配置以及更复杂的定义都将会在Global.asax中来实现。

     Global.asax中默认的路由设置

               routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}", // 带有参数的 URL
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
    );

    新添加一个路由设置

            //定义分页页面路由
    routes.MapRoute(
    "CategoryPager",
    "{controller}/{cid}_{pageNo}",
    new { controller = "Home", action = "Category" },
    new { cid = "[0-9]+", pageNo = "[0-9]+" }
    );


    8.web.config.网站配置文件,首先清楚我们的数据库连接在这里就行了。我们新建了一个数据实体映射,会在这里自动添加对应的数据库连接字段。如果我们是从模板新建的项目,自带了系统生成的用户权限程序,对应的数据库连接字段也在这里,系统在App_Data下自动创建了一个数据库文件, 详见==》。  如果我们需要修改它们,就在这里完成。

    接下来说说MVC部分,看看各部分之间是如何建立联系的。

    Controllers跟Views

    Controllers跟Views的部分很好理解,因为它们对应得实在太整齐了,MVC中的Views模板的做法其实跟我们asp时期的模板处理方法很相似,asp时期,我们会写一些html模板页,然后定义一些模板标签,对应程序中的方法,执行的时候替换后输出。比较明显的区别是,asp的程序中我们需要指定该页面使用哪个模板,MVC中我们不需要这样的操作,因为框架已经约定了前面提到的“太整齐的”的一一对应关系。所以Controller跟Views之间会自动予以匹配。

    HomeController.cs

    public class HomeController : Controller
    {
    /// <summary>
    /// 首页
    /// </summary>
    /// <returns></returns>
    public ActionResult Index()
    {
       //your code
    return View();
    }
    }

    return View();即表示返回对应名称的视图页面,如果我们希望返回其它视图页面,可以通过其重载方法实现 return View("视图名");

    Controllers跟Views之间的数据传递,可以通过下面3种方式实现:

    ViewBag.xxx;

    //控制器中
    ViewBag.Title = "xxxxxxx";
    //视图中
    @ViewBag.Title

    ViewData["xxx"]

    //控制器中
    ViewData["Categories"] = cmsService.GetCategories();
    //视图中
    <ul>
    @foreach (var item in ViewData["Categories"] as IEnumerable<YQCMS.Models.varticle>)
    {
    <li>@item.title</li>
    }
    </ul>


    return View(model);

       //控制器中
    varticle article = new varticle();
    article = cmsService.GetArticleByID(id);
    ViewBag.Title = article.title;
    return View(article);


    //视图中
    @model YQCMS.Models.varticle
    <div class="left"></div>
    <div class="right">
    <div class="article">
    <p class="title"><b>@Model.title</b></p>
    <p class="time">@Model.createdate</p>
    <p class="summary"><span style="font-style:italic;">@Html.Raw(Model.summary)</span></p>
    </div>
    </div>


    上面的例子中传递过来的都是object对象,如果我们需要把它作为具体的某个实体对象来使用,还需要对应的类型转换 eg:@foreach (var item in ViewData["Categories"] as IEnumerable<YQCMS.Models.varticle>)。也就意味着我们的Views层是需要跟Models层有联系的。
    ps.这也使MVC模式跟MVVM的差异所在,MVVM的VM实现了M跟V的完全隔离,但MVC没有,一开始我总觉的这两个就是一回事。

    Models层:


    Entity Framework是MVC里一个新的概念,简称EF。它把数据库对象映射到项目中,结合LINQ,我们的数据操作只需要基于我们的EF对象,而不再基于ADO.NET通过SQL语句操作数据库。

    Models文件夹上右键,添加--新建项--数据--ADO.NET实体数据模型。然后挑选你需要映射的表,视图以及储存过程。

    现在,我们的项目里Models层现在有3部分文件,

    1,我们的数据实体映射文件xxx.edmx.
    2.实体对象,如AccountModels.cs等。
    3.一个Services文件夹,这是我们后来创建的。这里主要实现了数据访问相关的逻辑。


    MVC中的Models层有点类似于传统三层里的数据对象层Model跟数据访问层DAL的结合体。我们后来新建了Services文件夹,将会处理类似DAL层的工作。

    Services文件夹的结构:



    IServices 定义了所有的数据操作方法接口。ServiceImpl文件夹下的ArticleServiceImpl.cs,CategoryServiceImpl.cs继承IServices接口并实现其方法。ArticleServiceImpl.cs,CategoryServiceImpl.cs是同一个部分类ServiceImpl的不同命名而已。这样处理是为了文件结构层次更加清晰。

    IServices.cs

    View Code

    ArticleServiceImpl.cs

    View Code



    CategoryServiceImpl.cs

    View Code

    CmsEntities entity = new CmsEntities();创建我们的数据模型实例,从而进行数据的操作。因为ArticleServiceImpl.cs,CategoryServiceImpl.cs只是同一个类的不同命名文件,所以我们只需要在其中任意一个文件下创建CmsEntities实例对象即可。


    Models跟Controllers的联系:

            /// <summary>
    /// 新建一个IServices接口对象,重载Initialize方法时创建一个ServiceImpl类(实现了IServices接口)的实例,
    /// 来实现Controllers跟Models之间交互,这里体现了面向接口编程的概念。
    /// </summary>
    public IServices cmsService { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
    if (cmsService == null) { cmsService = new ServiceImpl(); }
    base.Initialize(requestContext);
    }

    action中的调用

                    varticle article = new varticle();
    article = cmsService.GetArticleByID(id);

    ViewData["Categories"] = cmsService.GetCategories();
     
  • 相关阅读:
    [最短路,floyd] Codeforces 1202B You Are Given a Decimal String...
    ICPC 2015 Changchun A Too Rich(贪心)
    2016 杭州区域赛补题
    牛客网暑期ACM多校训练营(第六场) A Singing Contest
    牛客网暑期ACM多校训练营(第六场)J Heritage of skywalkert
    牛客网暑期ACM多校训练营(第六场)I Team Rocket (线段树)
    It’s Time for a Montage
    Attack on Alpha-Zet
    ecna 2017 J Workout for a Dumbbell (模拟)
    牛客网暑期ACM多校训练营(第二场)K carpet
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2432348.html
Copyright © 2020-2023  润新知