MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)
在2.1、栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟。
其实只要在NuGet中安装两个包(Microsoft.VisualStudio.Web.CodeGeneration.Tools和Microsoft.VisualStudio.Web.CodeGenerators.Mvc)就可以了。如下图:

是不是熟悉的感觉又回来了。。

现在可以用右键的在弹出的对话框中添加视图了。在实际的使用中模板,可以选择Create、Edit可以正常使用。

而选择Delete、Details和List时会出现下图的错误,搞了2天了都没搞定,麻烦知道的朋友留言或发QQ342211509解惑一下,谢谢。

分割线==========================================================
上次实现了栏目数据的显示,实际上栏目不会显示这些内容,而是根据栏目类型的不同以不同方式处理。如下图:

一、添加错误显示
首先吧错误页面的显示弄出来,方便后面使用。
1、错误模型
在Ninesky.Web上右键->添加->文件夹,输入名称Models。在Models上右键->添加->类,名称Error
1 namespace Ninesky.Web.Models
2 {
3 /// <summary>
4 /// 错误模型
5 /// </summary>
6 public class Error
7 {
8 /// <summary>
9 /// 错误
10 /// </summary>
11 public string Title { get; set; }
12
13 /// <summary>
14 /// 名称
15 /// </summary>
16 public string Name { get; set; }
17
18 /// <summary>
19 /// 描述
20 /// </summary>
21 public string Description { get; set; }
22 }
23 }
24
2、错误视图
打开视图Views\Shared\Error.cshtml,修改成如下代码
1 @model Ninesky.Web.Models.Error
2 @{
3 ViewData["Title"] = Model.Title;
4 }
5
6 <h2 class="text-danger">@Model.Name</h2>
7 <p>
8 @Html.Raw(Model.Description)
9 </p>
二、完善栏目显示Action和视图
1、修改栏目显示代码。
打开Controllers\CategoryController.cs修改Index代码如下:
1 /// <summary>
2 /// 查看栏目
3 /// </summary>
4 /// <param name="id">栏目Id</param>
5 /// <returns></returns>
6 [Route("/Category/{id:int}")]
7 public IActionResult Index(int id)
8 {
9 var category = _categoryService.Find(id);
10 if (category == null) return View("Error", new Models.Error { Title = "错误消息", Name="栏目不存在", Description="访问ID为【"+id+"】的栏目时发生错误,该栏目不存在。" });
11 switch (category.Type)
12 {
13 case CategoryType.General:
14 if (category.General == null) return View("Error",new Models.Error { Title="错误消息", Name="栏目数据不完整",Description="找不到栏目【"+category.Name+"】的详细数据。" });
15 return View(category.General.View, category);
16 case CategoryType.Page:
17 if (category.Page == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" });
18 return View(category.Page.View, category);
19 case CategoryType.Link:
20 if (category.Link == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" });
21 return Redirect(category.Link.Url);
22 default:
23 return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据错误", Description = "栏目【" + category.Name + "】的类型错误。" });
24
25 }
26 }
代码中根据栏目三种类型做不同的显示。
2、视图实现
常规栏目视图
打开Views\Category\Index.cshtml。修改代码如下:
1 @model Ninesky.Base.Category
2 @{
3 ViewData["Title"] = Model.Name;
4 }
5
6 <h2>@Model.Name</h2>
7 <div class="row">
8 <div class="col-lg-2 col-md-3">侧栏</div>
9 <div class="col-lg-10 col-md-9">
10 <div>
11 <dl class="dl-horizontal">
12 <dt>
13 @Html.DisplayNameFor(model => model.ParentId)
14 </dt>
15 <dd>
16 @Html.DisplayFor(model => model.ParentId)
17 </dd>
18 <dt>
19 @Html.DisplayNameFor(model => model.CategoryId)
20 </dt>
21 <dd>
22 @Html.DisplayFor(model => model.CategoryId)
23 </dd>
24 <dt>
25 @Html.DisplayNameFor(model => model.Name)
26 </dt>
27 <dd>
28 @Html.DisplayFor(model => model.Name)
29 </dd>
30 <dt>
31 @Html.DisplayNameFor(model => model.Type)
32 </dt>
33 <dd>
34 @Html.DisplayFor(model => model.Type)
35 </dd>
36 <dt>
37 @Html.DisplayNameFor(model => model.Description)
38 </dt>
39 <dd>
40 @Html.DisplayFor(model => model.Description)
41 </dd>
42 <dt>
43 @Html.DisplayNameFor(model => model.General.View)
44 </dt>
45 <dd>
46 @Html.DisplayFor(model => model.General.View)
47 </dd>
48 <dt>
49 @Html.DisplayNameFor(model => model.General.Module)
50 </dt>
51 <dd>
52 @Html.DisplayFor(model => model.General.Module)
53 </dd>
54 <dt>
55 @Html.DisplayNameFor(model => model.General.ContentView)
56 </dt>
57 <dd>
58 @Html.DisplayFor(model => model.General.ContentView)
59 </dd>
60 <dt>
61 @Html.DisplayNameFor(model => model.General.ContentOrder)
62 </dt>
63 <dd>
64 @Html.DisplayFor(model => model.General.ContentOrder)
65 </dd>
66 </dl>
67 </div>
68 </div>
69 </div>
单页栏目视图
将常规栏目视图Index复制并重命名为Page.cshtml,修改代码以显示单页模型内容
1 @model Ninesky.Base.Category
2 @{
3 ViewData["Title"] = Model.Name;
4 }
5
6 <h2>@Model.Name</h2>
7 <div class="row">
8 <div class="col-lg-2 col-md-3">侧栏</div>
9 <div class="col-lg-10 col-md-9">
10 <div>
11 <dl class="dl-horizontal">
12 <dt>
13 @Html.DisplayNameFor(model => model.ParentId)
14 </dt>
15 <dd>
16 @Html.DisplayFor(model => model.ParentId)
17 </dd>
18 <dt>
19 @Html.DisplayNameFor(model => model.CategoryId)
20 </dt>
21 <dd>
22 @Html.DisplayFor(model => model.CategoryId)
23 </dd>
24 <dt>
25 @Html.DisplayNameFor(model => model.Name)
26 </dt>
27 <dd>
28 @Html.DisplayFor(model => model.Name)
29 </dd>
30 <dt>
31 @Html.DisplayNameFor(model => model.Type)
32 </dt>
33 <dd>
34 @Html.DisplayFor(model => model.Type)
35 </dd>
36 <dt>
37 @Html.DisplayNameFor(model => model.Description)
38 </dt>
39 <dd>
40 @Html.DisplayFor(model => model.Description)
41 </dd>
42 <dt>
43 @Html.DisplayNameFor(model => model.Page.Content)
44 </dt>
45 <dd>
46 @Html.Raw(Model.Page.Content)
47 </dd>
48 </dl>
49 </div>
50 </div>
51 </div>
三、完善数据存储代码
打开Ninesky.DataLibrary的BaseRepository.cs,修改Find方法,改好后的代码如下:
1 /// <summary>
2 /// 查询
3 /// </summary>
4 /// <param name="keyValue">主键</param>
5 /// <returns>实体</returns>
6 public virtual T Find(params object[] keyValue)
7 {
8 return _dbContext.Set<T>().Find(keyValue);
9 }
10
11 /// <summary>
12 /// 查询
13 /// </summary>
14 /// <param name="predicate">查询表达式</param>
15 /// <returns>实体</returns>
16 public virtual T Find(Expression<Func<T, bool>> predicate)
17 {
18 return Find(null, predicate);
19 }
20
21 /// <summary>
22 /// 查询
23 /// </summary>
24 /// <param name="includeParams">导航属性</param>
25 /// <param name="predicate">查询表达式</param>
26 /// <returns>实体</returns>
27 public virtual T Find(string[] includeParams, Expression<Func<T, bool>> predicate)
28 {
29 var queryable = _dbContext.Set<T>().AsQueryable();
30 if (includeParams != null)
31 {
32 foreach (string param in includeParams)
33 {
34 queryable = queryable.Include(param);
35 }
36 }
37 return queryable.SingleOrDefault(predicate);
38 }
_dbContext.Set<T>().Find(keyValue);根据主键查询实体,会先查询缓存,优先使用。
SingleOrDefault(predicate); 根据表达式查询:
- public virtual T Find(string[] includeParams, Expression<Func<T, bool>> predicate)-带导航属性
- public virtual T Find(Expression<Func<T, bool>> predicate)-不带导航属性
四、完善业务逻辑
到项目Ninesky.Base中,打开CategoryService,修改Find方法
1 /// <summary>
2 /// 查找
3 /// </summary>
4 /// <param name="Id">栏目Id</param>
5 /// <returns></returns>
6 public Category Find(int Id)
7 {
8 return _baseRepository.Find(new string[] { "General", "Page", "Link" }, c => c.CategoryId == Id);
9 }
五、输入测试数据
打开Sqlserver 对象资源管理器,找到Ninesky数据库

分别向表Categories,CategoryGeneral,CategoryPage、CategoryLink手动添加数据,如下图:




在VS中按F5运行。浏览器中输入Id=2显示常规栏目

Id=3显示

Id=5则跳转。
六、其他
代码托管地址:https://git.oschina.net/ninesky/Ninesky
文章发布地址:http://www.ninesky.cn
代码包下载:2.1补充.rar
MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)的更多相关文章
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示
上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...
- MVC Core 网站开发(Ninesky) 1、创建项目
又要开一个新项目了!说来惭愧,以前的东西每次都没写完,不是不想写完,主要是我每次看到新技术出来我都想尝试一下,看到.Net Core 手又痒了,开始学MVC Core. MVC Core最吸引我的有三 ...
- MVC Core 网站开发(Ninesky) 2、栏目
栏目是网站的常用功能,按照惯例栏目分常规栏目,单页栏目,链接栏目三种类型,这次主要做添加栏目控制器和栏目模型两个内容,控制器这里会用到特性路由,模型放入业务逻辑层中(网站计划分数据访问.业务逻辑和We ...
- MVC个人网站开发笔记-150302
上传图片 参考这篇文章:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 调用ajaxFileUpload,控制器里面编 ...
- MVC Core
.NET Core 1.1 发布 文档下载资源汇总 https://www.microsoft.com/net/core#windowsvs2015 https://docs.microsoft.co ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...
- .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法
在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- MVC5 网站开发之八 栏目功能 添加、修改和删除
本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...
随机推荐
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- MIP改造常见问题二十问
在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...
- 在离线环境中发布.NET Core至Windows Server 2008
在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- JavaScript之链式结构序列化
一.概述 在JavaScript中,链式模式代码,太多太多,如下: if_else: if(...){ //TODO }else if(...){ //TODO }else{ //TODO } swi ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- 【需求设计1】VIP积分系统无聊YY
RT,想到什么就写什么呗,这是最简单的方式,顺便给自己做一个记录,反正自己记忆力也不太好.本文是仿陆金所的积分系统,自己YY的一套东西. 首先我想做一个VIP兑换投资卷的功能: 我们先来确定一些我知道 ...
- VS2015在创建项目时的一些注意事项
一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...
- GitHub管理代码-随笔
公司一直用的SVN进行项目管理,平时便自己折腾了下Git,这里做下GitHub的最简单的记录... 在git上创建仓库等就免谈了,网上也有好多教程,直接从创建之后记录: 在github的readme文 ...
- 如何dos命令打开服务窗口?
1.输入services.msc点击<确定>进入服务窗口.如图: