11
2016
12

.Net Core MVC 网站开发(Ninesky) 2.1、栏目的前台显示(补充)

在2.1、栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟。

其实只要在NuGet中安装两个包(Microsoft.VisualStudio.Web.CodeGeneration.Tools和Microsoft.VisualStudio.Web.CodeGenerators.Mvc)就可以了。如下图:


image


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

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

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


分割线==========================================================

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


一、添加错误显示

首先吧错误页面的显示弄出来,方便后面使用。

1、错误模型

Ninesky.Web上右键->添加->文件夹,输入名称Models。Models上右键->添加->,名称Error

namespace Ninesky.Web.Models
{
    /// <summary>
    /// 错误模型
    /// </summary>
    public class Error
    {
        /// <summary>
        /// 错误
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; set; }
    }
}

2、错误视图

打开视图Views\Shared\Error.cshtml,修改成如下代码

@model Ninesky.Web.Models.Error
@{
    ViewData["Title"] = Model.Title;
}
<h2 class="text-danger">@Model.Name</h2>
<p>
    @Html.Raw(Model.Description)
</p>

 

二、完善栏目显示Action和视图

1、修改栏目显示代码。

打开Controllers\CategoryController.cs修改Index代码如下:

/// <summary>
        /// 查看栏目
        /// </summary>
        /// <param name="id">栏目Id</param>
        /// <returns></returns>
        [Route("/Category/{id:int}")]
        public IActionResult Index(int id)
        {
            var category = _categoryService.Find(id);
            if (category == null) return View("Error", new Models.Error { Title = "错误消息", Name="栏目不存在", Description="访问ID为【"+id+"】的栏目时发生错误,该栏目不存在。" });
            switch (category.Type)
            {
                case CategoryType.General:
                    if (category.General == null) return View("Error",new Models.Error { Title="错误消息", Name="栏目数据不完整",Description="找不到栏目【"+category.Name+"】的详细数据。" });
                    return View(category.General.View, category);
                case CategoryType.Page:
                    if (category.Page == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" });
                    return View(category.Page.View, category);
                case CategoryType.Link:
                    if (category.Link == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" });
                    return Redirect(category.Link.Url);
                default:
                    return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据错误", Description = "栏目【" + category.Name + "】的类型错误。" });
            }
        }

代码中根据栏目三种类型做不同的显示。

2、视图实现

常规栏目视图

打开Views\Category\Index.cshtml。修改代码如下:

@model Ninesky.Base.Category
@{
    ViewData["Title"] = Model.Name;
}
<h2>@Model.Name</h2>
<div class="row">
    <div class="col-lg-2 col-md-3">侧栏</div>
    <div class="col-lg-10 col-md-9">
        <div>
            <dl class="dl-horizontal">
                <dt>
                    @Html.DisplayNameFor(model => model.ParentId)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.ParentId)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.CategoryId)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.CategoryId)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Name)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Name)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Type)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Type)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Description)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Description)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.General.View)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.General.View)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.General.Module)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.General.Module)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.General.ContentView)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.General.ContentView)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.General.ContentOrder)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.General.ContentOrder)
                </dd>
            </dl>
        </div>
    </div>
</div>

单页栏目视图

将常规栏目视图Index复制并重命名为Page.cshtml,修改代码以显示单页模型内容

@model Ninesky.Base.Category
@{
    ViewData["Title"] = Model.Name;
}
<h2>@Model.Name</h2>
<div class="row">
    <div class="col-lg-2 col-md-3">侧栏</div>
    <div class="col-lg-10 col-md-9">
        <div>
            <dl class="dl-horizontal">
                <dt>
                    @Html.DisplayNameFor(model => model.ParentId)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.ParentId)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.CategoryId)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.CategoryId)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Name)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Name)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Type)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Type)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Description)
                </dt>
                <dd>
                    @Html.DisplayFor(model => model.Description)
                </dd>
                <dt>
                    @Html.DisplayNameFor(model => model.Page.Content)
                </dt>
                <dd>
                    @Html.Raw(Model.Page.Content)
                </dd>
            </dl>
        </div>
    </div>
</div>


三、完善数据存储代码

打开Ninesky.DataLibrary的BaseRepository.cs,修改Find方法,改好后的代码如下:


        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="keyValue">主键</param>
        /// <returns>实体</returns>
        public virtual T Find(params object[] keyValue)
        {
            return _dbContext.Set<T>().Find(keyValue);
        }
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="predicate">查询表达式</param>
        /// <returns>实体</returns>
        public virtual T Find(Expression<Func<T, bool>> predicate)
        {
            return Find(null, predicate);
        }
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="includeParams">导航属性</param>
        /// <param name="predicate">查询表达式</param>
        /// <returns>实体</returns>
        public virtual T Find(string[] includeParams, Expression<Func<T, bool>> predicate)
        {
            var queryable = _dbContext.Set<T>().AsQueryable();
            if (includeParams != null)
            {
                foreach (string param in includeParams)
                {
                    queryable = queryable.Include(param);
                }
            }
            return queryable.SingleOrDefault(predicate);
        }


_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方法

/// <summary>

        /// 查找

        /// </summary>

        /// <param name="Id">栏目Id</param>

        /// <returns></returns>

        public Category Find(int Id)

        {

            return _baseRepository.Find(new string[] { "General", "Page", "Link" }, c => c.CategoryId == Id);

        }

五、输入测试数据

打开Sqlserver 对象资源管理器,找到Ninesky数据库

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






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

Id=3显示

Id=5则跳转。

六、其他

 

代码托管地址:https://git.oschina.net/ninesky/Ninesky

文章发布地址:http://www.ninesky.cn

                 http://mzwhj.cnblogs.com/

 

 

 



代码包下载:2.1补充.rar


返回目录

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。