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 网站开发之八 栏目功能 添加、修改和删除
本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...
随机推荐
- Taurus.MVC 2.0 开源发布:WebAPI开发教程
背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- requests的content与text导致lxml的解析问题
title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...
- Phoenix综述(史上最全Phoenix中文文档)
个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- Express 教程 01 - 入门教程之经典的Hello World
目录: 前言 一.Express?纳尼?! 二.开始前的准备工作 三.测试安装之经典的Hello World 四.使用express(1)来生成一个应用程序 五.说明 前言: 本篇文章是建立在Node ...
- Centos6.x 下安装Jexus独立版
操作步骤: #cd /tmp #wget linuxdot.net/down/jexus-5.8.1-x64.tar.gz 注:如果有新版本,则修改为相应版本号即可. #tar -zxvf jexus ...
- 腾讯云下安装 nodejs + 实现 Nginx 反向代理
本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑 ...
- 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践
写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...