关于后台的说明:

后台将会用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. 从业十余年谈谈对dotnet看法与坚持

    前言 园子经常在讨论关于.Net发展的问题,我也这些年在工作乃至创业过程中使用.Net碰到的一些问题和看法.个人擅长的技术面,C/C++/MFC/STL.ASM.JAVA.VB.Javascript/ ...

  2. OpenGL入门

    OpenGL是个啥... 网上资料挺多的,今天在codeblocks配置了一下..抄了一会书上的代码,还挺有意思的. 首先,从官网把glut的包给下载下来,点这里. 以下内容从网上抄的: 将glut. ...

  3. PC端一些非经典兼容性问题小札

    IE10默认在input框中输入内容后会显示一个‘X’按钮,方便删除输入的所有内容. 在password输入框显示一个眼睛的按钮,去掉叉叉和眼睛的方法如下: ::-ms-clear { display ...

  4. 关于使用iframe嵌套页面的跳转方式

    一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.location.href.locatio ...

  5. 文件处理命令:sed

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

  6. URL的截取问题

    $(function (){ if (window.location.href.includes('?')) { if (window.location.href.split('?')[1].spli ...

  7. 不使用return false阻止event默认行为

    当我们点击一个a标签时,如果这个标签的href指向了另一个地址,那么浏览器会默认跳转到此地址.在页面中,有时我们需要触发点击事件,但是又不想触发默认行为,就需要阻止event的默认行为了. 常规做法 ...

  8. Mybatis添加到Spring

    一.准备工作: 1.1 添加相应的jar包依赖: 这里用到了两个jar包,一个是mybatis的,另一个是mybatis-spring的,代码如下: 1 2 3 4 5 6 7 8 9 10 < ...

  9. Redis 做消息队列

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  10. java-JDBC从数据库中读取数据并进行日期民族男女的转换

    代码如下: package com.itnba.maya.mysql; import java.sql.*; import java.text.SimpleDateFormat; public cla ...