转载地址:http://www.jhrs.com/2018/15154.html
今天这个老司机其实也不是老司机,在.net core上面,也是新司机,都是现炒现卖而已,文中有不对的地方,敬请各位少点口水哈;后续的文章都是关于.net core做项目中遇到的问题的一些笔记仅此而已,如能使您学到或者了解点新东西,那自然最好不过了。公司新项目使用.net core来开发了,今天在搭建项目时,在新建.net core的web项目时,有两个选项,一个是【web 应用程序】,一个是【web应用程序(模型视图控制器)】,见下图所示:
现就两者的区别介绍下如:
创建好web应用程序后,在网站根目录下有两个文件夹:wwwroot、Pages。
Wwwroot:这个目录自不必多言,主要是放一些静态资源文件,如js文件、css文件、图片文件等,展开目录一眼便可看出。
Pages目录:项目创建好后,默认有下图展示的一些文件,从命名上来看,有视图的起始页,布局页,以及首页、关于等界面。
左侧的三角可以展开,展开好,有一个C#的类文件,类似于webform的代码后置文件,这个类文件就是处理当前页面请求事件的,如:点击按钮保存、翻页查询、ajax请求响应等的处理都可以以后置类里面写代码来搞。
在带有身份认证的网站,你可以分为前台和后台,这时你可以在Pages目录下新建个目录,如Manage,然后就可以在Manage里面新建页面来实现相应的功能,如下图所示我们可以直接在Manage目录上右键->添加->Razor页面
我执行了添加操作,并且添加了一个Login页面,用于处理登录事件,如下图所示:
然后我们运行下网站看看效果,就是长成下面图的一个样子,注意地址栏的地址是:http://localhost:10415/manage/login
怎么样?看到了吧,是不是类似于webform时代aspx页面的样子呢?
问题:如果我想在根目录新建个文件夹来保存我网站功能的页面,是否可行呢?答案是:No,反正我目前还不知道如果要这样子搞,该怎样弄,因为我也是对.net core摸着石头过河再使用,如有朋友知道,请告诉我一声。我们来实际试试吧,在根目录新建个目录:UserAdmin,然后看看能不能新建页面,结果如下图所示:
从实际操作来看,没有办法在根目录里面通过右键创建的文件夹新建页面地。
那我们换种姿势来新建个页面试试呢,使用快捷键来搞搞,选中UserAdmin目录按 Ctrl+Shift+A,出来如下界面,并选择页面,创建好后的页面,我是没有找到咋访问地。
页面是创建好了,咋访问啊?不能访问没用啊。。。。
总结:基于以上的操作实验,web应用程序的项目,兜兜转转,似乎又回到了ASP.NET Web 窗体通过aspx页面时代以目录来组织网站的功能页面了。换句话说就是:使用 Razor 页面,可以创建简单的文件夹层次结构,映射到应用程序的 URL 结构。这样子搞的好处是可以减少MVC 应用程序需要遵循的约定。
如果您新建的项目选择的是【web应用程序(模型视图控制器)】,则在网站的根目录则中规中矩生成了4个文件夹,分别是:wwwroot、Controllers、Models、Views,有过MVC开发经验的童鞋一看就明白怎么回事了,如下图所示:
Wwwroot:存放静态资源文件,如js文件、css文件、图片文件等。
Controllers:控制器,存储页面文件后台处理类,类里面可以处理如页面提交过来的按钮事件、ajax 查询等等。
Models:模型,模型大家应该都知道啥意思,有些朋友把要持久化的Model和页面显示或者前后台数据交互传数据的Model也放这里面,也是可以的,至于合不合适,在我看来,自己喜欢就好。
Views:这个好理解,在网站里面你就当成网页文件吧。
总结:web应用程序与web应用程序(模型控制器)的区别
后记:如何将控制器/视图页面改为使用 Razor 页面?
1、将 Razor 视图文件复制到 /Pages 文件夹中的相应位置。
2、将 @page 指令添加到视图。如果这是仅支持 GET 的视图,操作到此结束。
3、添加名为 viewname.cshtml.cs 的 PageModel 文件,并将它放入包含 Razor 页面的文件夹中。
4、如果视图有 ViewModel,请将它复制到 PageModel 文件中。
5、将与视图关联的所有操作从 Controller 复制到 PageModel 类。
6、重命名操作,以使用 Razor 页面处理程序语法(例如,“OnGet”)。
7、使用页面方法替换对视图帮助程序方法的引用。
8、将任何构造函数依赖关系注入代码从 Controller 复制到 PageModel 中。
9、将视图的代码传递模型替换为 PageModel 上的 [BindProperty] 属性。
10、同时,将接受视图模型对象的操作方法参数替换为 [BindProperty] 属性。