栏目类型跟原来一样分为常规栏目、单页栏目和外部链接。根据栏目类型的不同要隐藏相应的表单和验证(服务器端验证)。另外一个是父栏目必须是常规栏目才行,easyui-combotree要用到树形json数据,考虑不用递归函数而是用ParentPath字段排序的方式实现。

 

首先在在【CategoryController】中添加这个action,代码

/// <summary>
/// 栏目树
/// </summary>
/// <param name="categoryId">栏目Id,调用所有栏目为0</param>
/// <param name="categoryType">栏目类型-1所有栏目,0常规栏目</param>
/// <param name="jsonType">返回的数据类型【默认(0)-EasyuiTree类型】</param>
/// <returns>Json类型数据</returns>
public JsonResult Tree(int categoryId = 0, int categoryType = 0, int jsonType = 0)
{
IQueryable<Category> _categorys;
if (categoryType == -1) _categorys = categoryRepository.Progeny(categoryId).OrderByDescending(c => c.ParentPath).ThenBy(c => c.Order);
else _categorys = categoryRepository.Progeny(categoryId, categoryType).OrderByDescending(c => c.ParentPath).ThenBy(c => c.Order);
switch (jsonType)
{
default:
List<EasyuiTreeNodeViewModel> _trees = new List<EasyuiTreeNodeViewModel>();
Dictionary<int, EasyuiTreeNodeViewModel> _nodes = new Dictionary<int, EasyuiTreeNodeViewModel>();
foreach (var _category in _categorys)
{
if (_trees.Exists(n => n.parentid == _category.CategoryId))//存在子节点
{
var _childern = _trees.Where(n => n.parentid == _category.CategoryId).ToList();
_trees.RemoveAll(n => n.parentid == _category.CategoryId);
_trees.Add(new EasyuiTreeNodeViewModel { parentid = _category.ParentId, id = _category.CategoryId, text = _category.Name, state = "open", children = _childern });
}
else _trees.Add(new EasyuiTreeNodeViewModel { parentid = _category.ParentId, id = _category.CategoryId, text = _category.Name, state = "close"});
}
return Json(_trees);
}
}

 

再在控制器中添加Add的局部视图方法

/// <summary>
/// 添加栏目
/// </summary>
/// <returns>局部视图</returns>
public PartialViewResult Add()
{
return PartialView(new Category { CategoryView = "Index", ContentOrder = 0, ContentView = "Detail", Model = "", Order = 0, PageSize = 20, ParentId = 0, RecordName = "文章", RecordUnit = "篇", Type = 0 });
}

右键添加强类型局部视图

@model Ninesky.Models.Category
<div class="c_navbar">栏目管理 >> 添加栏目</div>
@using (Html.BeginForm("Add", "Category", FormMethod.Post, new { id = "categoryadd_form" }))
{
@Html.AntiForgeryToken()
<div class="fs_wapper">
<div class="header">添加栏目</div>
@Html.ValidationSummary()
<table class="fieldset">
<tr>
<th>@Html.LabelFor(model => model.Name)<span>*</span></th>
<td>@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
@Html.DisplayDescriptionFor(model => model.Name) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.ParentId)<span>*</span></th>
<td>
<input id="ParentId" name="ParentId" style="width: 200px;" data-url="@Url.Action("Tree", "Category")" value="@Model.ParentId" />
@Html.ValidationMessageFor(model => model.ParentId)
</td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.Type)<span>*</span></th>
<td>
<input id="Type" name="Type" value="@Model.Type" />
@Html.ValidationMessageFor(model => model.Type)
</td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.Model)<span>*</span></th>
<td>
<input id="Model" name="Model" value="@Model.Model" data-url="@Url.Action("Items", "Module", new { id = 1 })" />
@Html.ValidationMessageFor(model => model.Model)
@Html.DisplayDescriptionFor(model => model.Model) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.CategoryView)<span>*</span></th>
<td>
<input id="CategoryView" class="easyui-combobox" name="CategoryView" data-options="valueField:'Name',textField:'Name',url:'@Url.Action("Views", "View", new { controllerName="Category" })'" value="@Model.CategoryView">
@Html.ValidationMessageFor(model => model.CategoryView)
</td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.ContentView)<span>*</span></th>
<td>
<input id="ContentView" class="easyui-combobox" name="ContentView" data-url="@Url.Action("Views", "View")" data-options="valueField:'Name',textField:'Name',url:'@Url.Action("Views", "Category", new { controllerName="Article" })'" value="@Model.ContentView">
@Html.ValidationMessageFor(model => model.CategoryView)
</td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.LinkUrl)<span>*</span></th>
<td>
@Html.EditorFor(model => model.LinkUrl)
@Html.ValidationMessageFor(model => model.LinkUrl)
@Html.DisplayDescriptionFor(model => model.LinkUrl) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.Order)<span>*</span></th>
<td>
@Html.EditorFor(model => model.Order)
@Html.ValidationMessageFor(model => model.Order)
@Html.DisplayDescriptionFor(model => model.Order) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.ContentOrder)<span>*</span></th>
<td>
<select id="ContentOrder" name="ContentOrder" class="easyui-combobox" style="width: 200px;"
data-options="url:'@Url.Action("OrderList", "Item", new {area="" })',valueField:'Value',textField:'Name'">
</select>
@Html.ValidationMessageFor(model => model.ContentOrder)
@Html.DisplayDescriptionFor(model => model.ContentOrder) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.PageSize)<span>*</span></th>
<td>
@Html.EditorFor(model => model.PageSize)
@Html.ValidationMessageFor(model => model.PageSize)
@Html.DisplayDescriptionFor(model => model.PageSize) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.RecordUnit)<span>*</span></th>
<td>
@Html.EditorFor(model => model.RecordUnit)
@Html.ValidationMessageFor(model => model.RecordUnit)
@Html.DisplayDescriptionFor(model => model.RecordUnit) </td>
</tr>
<tr>
<th>@Html.LabelFor(model => model.RecordName)<span>*</span></th>
<td>
@Html.EditorFor(model => model.RecordName)
@Html.ValidationMessageFor(model => model.Name)
@Html.DisplayDescriptionFor(model => model.RecordName) </td>
</tr>
<tr>
<th></th>
<td>
<a id="CategoryAdd_Save" href="javascript:void()" class="easyui-linkbutton">保存</a>
</td>
</tr>
</table>
</div>
@Scripts.Render("~/Areas/Admin/Scripts/Category.js");
<script type="text/javascript">
CategoryAddReady();
</script>
}
@Scripts.Render("~/bundles/jqueryval")

在category.js中添加相应的js函数

//Add视图添加载完成函数
function CategoryAddReady() {
$.post($('#ParentId').attr('data-url'), null, function (data) {
if (data == "") data = [{ id: 0, text: "无" }];
else {
data.unshift({ id: 0, text: "无" });
}
$('#ParentId').combotree({ required: true, data: data }); });
$('#Type').combobox({
valueField: 'id',
textField: 'text',
data: [{ 'id': 0, 'text': '常规栏目' }, { 'id': 1, 'text': '单页栏目' }, { 'id': 2, 'text': '外部链接' }],
required: true,
onSelect: function (rec) {
CategoryAdd_TypeChange(rec.id);
}
});
$.post($('#Model').attr("data-url"), null, function (data) {
if (data == "") data = [{ Model: "", Name: "无" }];
else {
data.unshift({ Model: "", Name: "无" });
}
$('#Model').combobox({
valueField: 'Model',
textField: 'Name',
data: data,
required: true,
onSelect: function (rec) {
CategoryAdd_ModelChange(rec.Model);
}
});
}); $('#ContentView').parent().parent().hide();
$('#LinkUrl').parent().parent().hide();
$('#ContentOrder').parent().parent().hide();
$('#RecordUnit').parent().parent().hide();
$('#PageSize').parent().parent().hide();
$('#RecordName').parent().parent().hide();
//保存事件
$('#CategoryAdd_Save').click(function () {
CategoryAdd_Save();
});
//CategoryAdd_TypeChange(0);
}
//Add视图类型切换事件
function CategoryAdd_TypeChange(typeId) {
//常规栏目
if (typeId == 0) {
//模型
$('#Model').parent().parent().show();
var _modelValue = $('#Model').combobox('getValue');
CategoryAdd_ModelChange(_modelValue); }//单页栏目
else if (typeId == 1) {
//模型
$('#Model').parent().parent().hide();
//栏目视图
$('#CategoryView').parent().parent().show();
//内容视图
$('#ContentView').parent().parent().hide();
//链接地址
$('#LinkUrl').parent().parent().hide();
//内容排序
$('#ContentOrder').parent().parent().hide();
//每页记录数
$('#PageSize').parent().parent().hide();
//记录单位
$('#RecordUnit').parent().parent().hide();
//记录名称
$('#RecordName').parent().parent().hide();
}//外部链接
else if (typeId == 2) {
//模型
$('#Model').parent().parent().hide();
//栏目视图
$('#CategoryView').parent().parent().hide();
//内容视图
$('#ContentView').parent().parent().hide();
//链接地址
$('#LinkUrl').parent().parent().show();
//内容排序
$('#ContentOrder').parent().parent().hide();
//每页记录数
$('#PageSize').parent().parent().hide();
//记录单位
$('#RecordUnit').parent().parent().hide();
//记录名称
$('#RecordName').parent().parent().hide();
}
} //Add视图模型切换事件
function CategoryAdd_ModelChange(value) {
if (value == "")//模型为无
{
//栏目视图 $('#CategoryView').parent().parent().show();
//内容视图
$('#ContentView').parent().parent().hide();
//链接地址
$('#LinkUrl').parent().parent().hide();
//内容排序
$('#ContentOrder').parent().parent().hide();
//每页记录数
$('#PageSize').parent().parent().hide();
//记录单位
$('#RecordUnit').parent().parent().hide();
//记录名称
$('#RecordName').parent().parent().hide();
}
else {
$('#CategoryView').parent().parent().show();
//内容视图
$('#ContentView').parent().parent().show();
//链接地址
$('#LinkUrl').parent().parent().hide();
//内容排序
$('#ContentOrder').parent().parent().show();
//每页记录数
$('#PageSize').parent().parent().show();
//记录单位
$('#RecordUnit').parent().parent().show();
//记录名称
$('#RecordName').parent().parent().show();
var _modelValue = $('#Model').combobox('getValue');
$('#ContentView').combobox('reload', $('#ContentView').attr('data-url') + '?controllerName=' + _modelValue);
}
}
//添加保存
function CategoryAdd_Save() {
$('#categoryadd_form').form('submit', {
success: function (data) {
var rt = jQuery.parseJSON(data);
//验证
Authentication(data.Authentication);
//操作成功
if (rt.Success) {
$(document.body).append("<div id='CategoryAdd_SuccessDialog'></div>");
$('#CategoryAdd_SuccessDialog').dialog({
title: '操作成功',
width: 280,
height: 138,
closed: false,
cache: false,
content: '<br />添加栏目成功',
modal: true,
buttons:[{
text:'继续添加栏目',
handler: function () {
var _layout = $('#layout');
var _center = _layout.layout('panel', 'center');
_center.panel('refresh');
var _west = _layout.layout('panel', 'west');
_west.panel('refresh');
$('#CategoryAdd_SuccessDialog').dialog('destroy');
}
},{
text:'关闭',
handler: function () {
var _layout = $('#layout');
var _west = _layout.layout('panel', 'west');
_west.panel('refresh');
$('#CategoryAdd_SuccessDialog').dialog('destroy');
}
}]
});
}
else {
var msg = "";
if (rt.ValidationList != undefined) ShowValidationMessage(rt.ValidationList);
if (msg != "") msg = rt.Message + "<br /> <p> 原因如下:" + "<ul>" + msg + "</ul></p>";
else msg = rt.Message;
$.messager.alert("添加栏目失败", msg, "error");
}
}
});
}

再次在控制器中添加处理action

[HttpPost]
public JsonResult Add(Category category)
{
JsonViewModel _jdata = new JsonViewModel();
if (ModelState.IsValid)//模型验证通过
{
//父栏目
if (category.ParentId == 0) category.ParentPath = "0";
else
{
var _parentCategory = categoryRepository.Find(category.ParentId);
if (_parentCategory == null) ModelState.AddModelError("ParentId", "父栏目不存在。");
else if (_parentCategory.Type != 0) ModelState.AddModelError("ParentId", "父栏目不是常规栏目,不能添加子栏目。");
else category.ParentPath = _parentCategory.ParentPath + "," + _parentCategory.CategoryId;
}
//根据栏目类型验证字段
switch (category.Type)
{
case 0://常规栏目
if (string.IsNullOrEmpty(category.Model))//模型为空
{
category.ContentView = category.LinkUrl = category.RecordUnit = category.RecordName = null;
category.ContentOrder = category.PageSize = null;
}
else
{
if (string.IsNullOrEmpty(category.CategoryView)) ModelState.AddModelError("CategoryView", "栏目视图不能为空。");
if (string.IsNullOrEmpty(category.ContentView)) ModelState.AddModelError("ContentView", "内容视图不能为空。");
if (category.ContentOrder == null) ModelState.AddModelError("ContentOrder", "内容排序方式不能为空。");
if (category.PageSize == null) ModelState.AddModelError("PageSize", "每页记录数不能为空。");
if (string.IsNullOrEmpty(category.RecordUnit)) ModelState.AddModelError("RecordUnit", "记录单位不能为空。");
if (string.IsNullOrEmpty(category.RecordName)) ModelState.AddModelError("RecordName", "记录名称不能为空。");
category.LinkUrl = null;
}
break;
case 1://单页栏目
if (string.IsNullOrEmpty(category.CategoryView)) ModelState.AddModelError("CategoryView", "栏目视图不能为空。");;
category.Model = category.ContentView = category.LinkUrl = category.RecordUnit = category.RecordName = null;
category.ContentOrder = category.PageSize = null;
break;
case 2:
if (string.IsNullOrEmpty(category.LinkUrl)) ModelState.AddModelError("LinkUrl", "链接地址不能为空。");
category.Model = category.CategoryView = category.ContentView = category.RecordUnit = category.RecordName =category.ContentView = null;
category.ContentOrder = category.PageSize = null;
break;
}
//存在逻辑验证错误
if (!ModelState.IsValid) return Json(new JsonViewModel(ModelState));
else
{
if (categoryRepository.Add(category)) return Json(new JsonViewModel() { Success = true, Message = "添加栏目成功!" });
else return Json(new JsonViewModel() { Success = false, Message = "未能保存导数据库。" });
}
}
//模型验证失败
else return Json(new JsonViewModel(ModelState));
}

MVC4做网站后台:栏目管理1、添加栏目-续的更多相关文章

  1. MVC4做网站后台:用户管理 ——用户组 1、添加用户组

    打开控制器UserGroupController 添加Add action /// <summary> /// 添加用户组 /// </summary> /// <ret ...

  2. MVC4做网站后台:用户管理 ——用户组

    用户管理这块包含用户和用户组两部分. 用户组包括浏览 用户组列表,添加.修改.删除用户组等.按照前面思路系统是依据用户组来判断用户权限的,用户组的最主要目的是划分权限.权限这块以后单独在做. 下面实现 ...

  3. MVC4做网站后台:模块管理1、修改模块信息

    网站可能会包含一些模块:像文章.产品.图片.留言等. 栏目模块主要实现功能,启用或禁用模块,模块权限设置,模块上传设置等. 权限设置和上传设置以后专门考虑,先来显示或禁用模块. 1.在顶部导航栏添加管 ...

  4. MVC4做网站后台:用户管理 —用户

    这块进行用户管理,可以浏览.查询已注册的用户,修改用户资料,删除用户等.没有做添加用户,不知是否必要.列表页还是使用easyui的datagrid.这个思路跟用户组的方式差不多. 1.接口Interf ...

  5. MVC4做网站后台:用户管理 ——用户组 2、查看、修改、删除用户组

    查看用户组资料和修改用户组资料结合在一起,在用户组列表双击查看用户组资料,修改资料点保存可以保存用户组,点删除可以删除用户组. 先在UserGroupController中添加 action publ ...

  6. MVC4做网站后台:用户管理 ——用户组补充

    上次做完发现存在点问题. 1.是类型显示的为数字(如下图): 2.是不能根据类型进行查询. 首先做查询.easyui-datagrid可以添加toolbar. 在datagrid的data-optio ...

  7. MVC4做网站后台:栏目管理1、添加栏目

    把栏目添加删除跟前台混在一起结构清晰,现在有了后台管理的区域就把后台管理相关的代码分开. 要实现功能: 1.添加栏目 2.删除栏目 3.修改栏目信息 -- 一.开始 1.添加 接口InterfaceC ...

  8. phpcms新增栏目字段_phpcms添加栏目属性

    先做个广告 WEB网站开发 APP后台开发 安卓开发 物流系统 时时彩系统开发 电商系统开发 微信开发 请联系我 QQ 13266112 or 184377367 phpcms新增栏目字段_phpcm ...

  9. PHPCMS v9在后台文章管理列表添加类别

    进入PHPCMS v9后台—内容,进入PHPCMS的文章管理列表,要实现在文章标题前显示文章类别,就是可以直接在文章列表里看到类别,不需要点击进入编辑页面才可以看到,如下图: PHPCMS v9在后台 ...

随机推荐

  1. [VijosP1764]Dual Matrices 题解

    题目大意: 一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数.你需要找到两个不相交的A*B的连续子矩形,使得这两个矩形包含的元素之和尽量大. 思路: 预处理,n2时间算出每个点 ...

  2. es6 数组的工具类

    根据Es6中map和Set的特性,实现了对array的分组和转换操作. exports.mapToObj = function (strMap) { let obj = Object.create(n ...

  3. Java Hashtable的实现

    先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...

  4. 解决:View调用invalidate()后不刷新onDraw()

    近来学android图片处理,按照例子来,自定义一个View,之后在Activity里面手动调用该View的invalidate()后,一直无法刷新onDraw() 上网搜了一下,有两种解决办法: 一 ...

  5. redis主从复制配置

    master配置 主要是下面配置 # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # intern ...

  6. android ADT 无法查看第三方jar源代码

    Source not foundThe JAR of this class file belongs to container 'Android Private Libraries' which do ...

  7. MVC辅助方法

    我相信很多人虽然经常用mvc去做一些东西,但是可能很少使用mvcHtml辅助方法 首先我们要创建一个mvc项目 二创建一个HtmlHelper文件夹 三编写文件 四调用辅助方法 调用辅助方法 和使用其 ...

  8. 用C语言编写生成小学四则运算程序

    使用软件——VS 2015 使用环境——C语言 早在上周我就开始使用C#语言做,由于最后一点问题而放弃,之后用C语言开始做,很顺利,但是也碰到了一些问题,但是通过了百度文库上的一些程序的借鉴和吴阿平同 ...

  9. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介

    ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一 ...

  10. clojure基础入门(一)

    最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...