通过一个简单的文章系统学习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();
 
原文地址:https://www.cnblogs.com/Leo_wl/p/2432348.html