关于后台的说明:

后台将会用easyui + ajax模式。

这里涉及两个问题,一个是使用easyui如何在前台验证模型的问题,另一个是ajax提交后返回数据。

一、Easyui验证

前台验证采用easyui控件的ValidateBox验证,通过自定义htmlhelper的方式建立与模型的联系。

1、到http://www.jeasyui.com/download/index.php下载EasyUi的最新版本,将js文件解压到~/script文件夹

将式样放到~/Areas/Admin/Content/Easyui/

然后打开BundleConfig.cs,添加如下代码

bundles.Add(new ScriptBundle("~/Scripts/Easyui").Include(
"~/Scripts/Easyui/jquery.easyui.js", "~/Scripts/Easyui/locale/easyui-lang-zh_CN.js"));
bundles.Add(new StyleBundle("~/Css/Admin/Easyui").Include("~/Areas/Admin/Content/Easyui/icon.css", "~/Areas/Admin/Content/Easyui/metro-blue/easyui.css"));

2、在~/Extensions文件夹中添加类EasyuiExtensions.cs

此类的目的是利用ModelMetadata元数据获取Model的验证Attribute然后生成带ValidateBox验证输入控件。

思路为:使用ModelMetadata.FromLambdaExpression获取模型字段的元数据->使用ModelValidatorProviders.Providers.GetValidators获取元数据中验证属性->根据属性生成ValidateBox的validType。

代码如下:

////////////////////
//Easyui控件Mvc扩展
//版本v1
//创建日期2013-09-28
////////////////////
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions; namespace System.Web.Mvc.Html
{
/// <summary>
/// EasyUi控件
/// </summary>
public static class EasyuiExtensions
{
public static MvcHtmlString EasyuiInput<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string type = "input")
{
return htmlHelper.EasyuiInput(expression, null,type:type);
}
public static MvcHtmlString EasyuiInput<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, string type = "input")
{
return htmlHelper.EasyuiInput(expression, htmlAttributes: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),type:type);
} public static MvcHtmlString EasyuiInput<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes, string type = "input")
{
ModelMetadata _metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
string _name = ExpressionHelper.GetExpressionText(expression);
string _fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(_name);
string _htmlCtrlstr = string.Empty;//控件Html字符
if (String.IsNullOrEmpty(_fullName))
{
throw new ArgumentException(_name + " 字段不存在!", "name");
}
TagBuilder tagBuilder = new TagBuilder(type);
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("name", _fullName, true);
tagBuilder.MergeAttribute("id", _fullName, true);
//值
if (_metadata.Model != null)
{
if (type.ToLower() == "input") tagBuilder.MergeAttribute("value", (string)_metadata.Model);
else if (type.ToLower() == "textarea") tagBuilder.InnerHtml = (string)_metadata.Model; }
///验证部分代码开始
Dictionary<string, object> _results = new Dictionary<string, object>();
string _validType = string.Empty;
if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
{
IEnumerable<ModelClientValidationRule> _clientRules = ModelValidatorProviders.Providers.GetValidators(_metadata ?? ModelMetadata.FromStringExpression(_name, htmlHelper.ViewData), htmlHelper.ViewContext).SelectMany(v => v.GetClientValidationRules());
if (_clientRules.Count() > 0)
{
_validType = string.Empty;
foreach (ModelClientValidationRule rule in _clientRules)
{
switch (rule.ValidationType)
{
case "required":
break;
case "length":
if (!string.IsNullOrEmpty(_validType)) _validType += ",";
if (rule.ValidationParameters.ContainsKey("min")) _validType += "'" + rule.ValidationType + "[" + rule.ValidationParameters["min"].ToString() + "," + rule.ValidationParameters["max"].ToString() + "]'";
else _validType += "'" + rule.ValidationType + "[0," + rule.ValidationParameters["max"].ToString() + "]'";
break;
default:
if (!string.IsNullOrEmpty(_validType)) _validType += ",";
_validType += "'" + rule.ValidationType + "'";
break;
}
}
if(!string.IsNullOrEmpty(_validType)) _validType = "validType:["+_validType+"]";
if (_metadata.IsRequired)
{
if (string.IsNullOrEmpty(_validType)) _validType = "required:true";
else _validType = "required:true," + _validType;
}
if (!string.IsNullOrEmpty(_validType)) tagBuilder.MergeAttribute("data-options", _validType);
}
}
///验证部分代码结束
if (type.ToLower() == "input") _htmlCtrlstr = tagBuilder.ToString((TagRenderMode.SelfClosing));
else if (type.ToLower() == "textarea") _htmlCtrlstr = tagBuilder.ToString();
return new MvcHtmlString(_htmlCtrlstr);
}
}
}

二、ajax返回数据

ajax提交后返回数据包含是否成功,及消息提示,另外如果服务器验证失败的话还要返回一个失败字段列表,干脆建一个类。

在~/Models文件夹中添加类JsonData,代码如下:

/////////////////
//版本:V1
//创建日期:2013-10-23
/////////////////
using System.Collections.Generic; namespace Ninesky.Models
{
public class JsonData
{
/// <summary>
/// 操作成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 消息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 消息列表
/// </summary>
public Dictionary<string, string> MsgLsit { get; set; }
public JsonData()
{
MsgLsit = new Dictionary<string, string>();
}
}
}

后台ajax提交后固定返回JsonData的json类型。

三、开始搭架子

1、添加布页

在~/Areas/Admin/Views/Shared中添加_Layout.cshtml。

后台页面采用easyui的layout,分north、south、west、center四个部分。代码如下:

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
@Styles.Render("~/Css/Admin")
@Styles.Render("~/Css/Admin/Easyui")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/Scripts/Easyui")
@Scripts.Render("~/Areas/Admin/Scripts/global.js")
</head>
<body class="easyui-layout">
<div id="north" data-options="region:'north'">
@Html.Action("PartialNorth","Home")
</div>
<div id="south" data-options="region:'south'"></div>
@RenderBody()
</body>
</html>

2、后台管理的主页——Home

在~/Areas/Admin/Controllers 添加【HomeController】

为[Index] action添加视图

@{
ViewBag.Title = "管理中心";
}
<div id="west" data-options="region:'west',title:' ',split:true" style="border-top:solid 1px #1BA1E2;border-right:solid 1px #1BA1E2;border-bottom:solid 1px #1BA1E2"></div>
<div id="center" data-options="region:'center'">
<div id="tabs" class="easyui-tabs" data-options="fit:true" style="margin-left: auto; margin-right: auto">
<div title="欢迎" style="padding:20px;">欢迎使用后台管理……</div>
</div>
</div>

这里用到了easyui的layout和tabs。

添加返回分部视图的action [PartialNorth] 这个在布局也中调用,显示layout的North部分,也就是页面的头部(图中1的位置)。

/// <summary>
/// 顶部视图
/// </summary>
/// <returns></returns>
public PartialViewResult PartialNorth()
{
return PartialView();
}

添加相应视图。

<div class="admininfo_bar">欢迎您:洞庭夕照  修改密码   退出 </div>
<div class="tools_bar">
<a id="home" href="#"><img src="~/Areas/Admin/Content/images/home.png" /> 首页</a>
<a id="cagegory_cfg" href="#"><img src="~/Areas/Admin/Content/images/folder.png" /> 栏目管理</a>
<a id="system_cfg" href="javascript:void(0)"><img src="~/Areas/Admin/Content/images/config.png" /> 系统设置</a>
</div>

完成后界面如下:

学用MVC4做网站六:后台管理(续)的更多相关文章

  1. 学用MVC4做网站六后台管理:6.1管理员(续)

    接6.1 首先在~/Areas/Admin/Models文件夹添加管理员模型Administrator.cs using System.ComponentModel.DataAnnotations; ...

  2. 学用MVC4做网站六后台管理:6.1.3管理员修改密码

    6.1.3修改密码 需要两个action.一个是点击修改密码的链接要显示修改密码的分部视图(对话框形式):另一个是提交的处理action. 1.打开[AdministratorController]添 ...

  3. 学用MVC4做网站六后台管理:6.1.1管理员登录、6.1.2退出

    1.管理员登录 在6.1中已添加控制器[AdministratorController] 在控制器中添加[Login()]action,用来显示登录页面 /// <summary> /// ...

  4. MVC4做网站六后台管理:6.2网站信息设置

    用来实现网站标题.名称.关键字.描述.版权等信息的设置. 模型字段: 网站的设置信息前后台都要用到,所以要把模型方式Ninesky/Models文件夹中,代码如下: ///////////////// ...

  5. MVC4做网站六后台管理:6.1.4管理员列表、添加及删除

    一.管理员列表 1.首先[AdministratorController]中添加返回分部视图的public PartialViewResult Index() /// <summary> ...

  6. 慕学在线网0.4_xadmin后台管理

    admin是基于Django开发的后台管理框架,方便,快捷,而且简单: 而xadmin就相当于admin的升级版,更加强大. 1.安装xadmin(源码安装方式) 教程 PS: - 卸载pip安装的x ...

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

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

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

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

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

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

随机推荐

  1. 【BZOJ】4144: [AMPPZ2014]Petrol

    题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...

  2. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...

  3. 文件处理命令:sed

    使用:sed [-nefr] actionaction:-i直接修改读取的档案内容,而不是由屏幕输出,-r表示支持延伸型正则表达式的语法.动作说明:[n1[,n2]] function n1,n2表示 ...

  4. oracle表空间简单学习

    1.重命名表空间:alter tablespace 原表空间名 rename to 新表空间名ps:(1)system 和sysaux表空间不能重名(2)如果该表空间中任何一个数据出于脱机状态或者表空 ...

  5. Myeclipse 不能保存汉字

    window-->首选项-->content type-->Text-->Default encoding改为UTF-8,点击update

  6. java发送邮件..转

    使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 JavaMail ...

  7. POJ1026 Cipher(置换的幂运算)

    链接:http://poj.org/problem?id=1026 Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  8. Java虚拟机

    虚拟机每次方法的调用和返回都伴随着栈帧的入栈和出栈,而每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用(表明该栈帧执行的是哪个方法),持有这个引用是为了支持方法调用中的动态连接.这些符号引用中 ...

  9. java的poi技术读取和导入Excel

    项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html  用到的Excel文件: http://www.cnblogs.com/h ...

  10. 如何创建一个Edge 浏览器扩展

    随着微软Windows 10 年度更新的发布,数次延宕的Edge 扩展功能终于得到了官方正式支持.我在我的另外一个博客上发布了如何创建一个Edge 浏览器扩展的博文,链接如下: https://blo ...