栏目类型跟原来一样分为常规栏目、单页栏目和外部链接。根据栏目类型的不同要隐藏相应的表单和验证(服务器端验证)。另外一个是父栏目必须是常规栏目才行,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. Time-travel Models

    1. Standard Iterative Branching model   Source Code   Butterfly Effect   Next   Edge of Tomorrow   D ...

  2. Redis 主从配置

    环境     Master/Slave     系统 IP Redis版本 Master     CentOS6.7         10.10.3.211         redis-3.2.6   ...

  3. 【BZOJ】4002: [JLOI2015]有意义的字符串

    题意 求$\left \lfloor \left( \frac{b+\sqrt{d}}{2} \right)^n \right \rfloor \pmod {7528443412579576937} ...

  4. druid sql黑名单 报异常 sql injection violation, part alway true condition not allow

    最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助, 但是最近发现里面 有条sql语句 被拦截了, ...

  5. JavaScript数组去重的几种方法

    这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记... 遍历时搜索结果数组 思路很明确,如下 新建一个数组存放结果 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在 若不存在 ...

  6. Github+Jekyll —— 创建个人免费博客(一)从零开始

    摘要: 本文中我将介绍一下如何在github上搭建个人Blog(博客),也顺便让我们掌握一下github Pages功能,另外还涉及到Jekyll技术. ======================= ...

  7. 【转】WriteMessage的信息在AutoCAD中命令行中实时显示

    之前程序中有段发送信息到命令行上显示的代码,如下:     ed.WriteMessage("开始标注横断面高程,请稍候!");     但是发现命令行中并不马上显示,代码也明明运 ...

  8. c++怎样让函数返回数组

    这个问题属于非常初级的问题,但是对于初学不知道的人可能会比较头疼.C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现.比如一个矩阵相乘的函数,很容易地我们就写成: ...

  9. c = (a / b, a%b) 运算输出顺序

    #include<iostream> int main() { using namespace std; int a, b, c; a = ; b = ; c = ; printf(&qu ...

  10. .Net开发笔记(十九) 创建一个可以可视化设计的对象

    阅读本篇博客之前需要了解VS窗体设计器的工作原理,详细可参见本系列博客(十).(十一).(十二).必须需要知道的一条结论就是:处于窗体设计器(Form Designer)中的任何组件(包含控件,下同) ...