栏目类型跟原来一样分为常规栏目、单页栏目和外部链接。根据栏目类型的不同要隐藏相应的表单和验证(服务器端验证)。另外一个是父栏目必须是常规栏目才行,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. OCIEnvNlsCreate 失败,返回代码为 -1,但错误消息文本不可用

    通过Navicat for Oracle能连接成功,增删改查正常,可一用到ADO.NET就报这个错误. 原来我一开始是用“管理员”方式安装的Client,后来用“InstantClient”方式重装就 ...

  2. PHP浮点数精度问题

    这一段时间维护一个类似团购的系统,需要处理订单,也就难免会处理金额 所以有很多PHP的坑 被我狠狠的踩了~~ 首先我们要知道浮点数的表示(IEEE 754): 简言之 就是 埋下了一个大坑 等着你跳 ...

  3. Nginx反向代理和负载均衡

    一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...

  4. mina通信 demo

    1,要用到4个jar 2,服务端 package mina.server; import java.io.IOException; import java.net.InetSocketAddress; ...

  5. JVM垃圾收集器

    JVM中垃圾的回收由垃圾收集器进行,随着JDK的不断升级,垃圾收集器也开发出了各种版本,垃圾收集器不断优化的动力,就是为了实现更短的停顿. 下面是7种不同的分代收集器,如果两个收集器之间有连线,则表示 ...

  6. Xamarin的不归路-使用Gorilla Player实时预览XAML

    搞了一天,才安装好,记录一下遇到的坑,为大家节约些时间. 一.下载软件 软件下载地址:http://gorillaplayer.com/ 没有FQ前用360极速浏览器和迅雷下载了好多次都失败了.用了蓝 ...

  7. MySQL查询和删除重复数据

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...

  8. 【TJOI&HEOI2016】【Bzoj4551】树

    这道题是可以用树链剖分来做的,但其实有比它更加简单的做法--并查集. 可以想到,这类题的一种常见做法是离线处理,先全部读入,再从后往前处理,每次遇到标记操作,就把这个点的标记次数减一,到零以后就把这个 ...

  9. 用 string 进行插入、替代、查找输出下标等操作

    string s; s = "; string::iterator it; it = s.begin();//让s指向第一个元素 cout << s; system(" ...

  10. Github上传代码菜鸟超详细教程

      最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选 ...