首页 > 编程语言 >一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)

一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)

时间:2023-05-21 14:08:16浏览次数:45  
标签:me Asp success 删除 一步 代码 用户 MVC 方法


现在来完成删除功能。目前的Grid,一次只能选择一行,也就是说,一次只能删除一行,不太方便,因而要设置成使用复选框选择,并允许多选的。在用户视图脚本文件中,添加以下配置项实现这个:

"checkboxmodel",

false, mode: "MULTI"

 

打开页面浏览,会看到如图29所示的效果,已经可以在最左边通过复选框进行行选择了。

一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)_cms

图29 添加了复选框选择行的Grid

删除用户的方式有2种,一种是先使用remove方法在Store中删除记录,然后调用sync方法同步,一种是提取选择行的id,然后通过Ajax方式提交到服务器进行删除,确认后再在客户端刷新页面。第一种方式必须在proxy的api定义中定义destroy配置项,之前的代码中已经定义了,因而本示例将使用该方式。第二种方式如果也定义了destroy配置项,就千万别用remove删除Store的记录,不然在添加或编辑的时候,调用sync方法进行同步的时候会把删除记录的数据一起提交的。选用那种方法,看喜好吧!呵呵。

现在切换到Users控制器的脚本,为删除按钮绑定单击事件,代码如下:

me.getButtonUserDelete().on("click",me.onDeleteUser, me);

 

在onDeleteUser方法内,要先从Store的选择模型获取选择的记录。如果有选择记录,则先提示用户是否真的删除用户。确认后,调用remove方法删除记录,并调用sync方法同步数据,如果成功,调用commitChanges方法确认修改,否则调用rejectChanges方法取消修改。具体代码如下:

function
var me = this,
             sm =me.getUserView().getSelectionModel();
if
var
"确定删除以下用户?"];
for (var
               content.push(rs[i].data.Username);
            }
"删除用户", content.join("<br/>"), function
if(btn == "yes") {
varme = this,
                        rs =me.getUserView().getSelectionModel().getSelection()
                   store = me.getUsersStore();
                   store.remove(rs);
                   store.sync({
function
var me = this;
                            me.getUsersStore().commitChanges();
                        },
function
var me = this;
                           me.getUsersStore().rejectChanges()
"发生错误", e.exceptions[0].error);
                        },
                        scope: me
                   });
               }
           }, me)
else
'删除用户', '请选择要删除的用户。');
        }
    }

代码中,使用了数组content来组合确认信息。当用户确认后,就调用remove方法,并调用sync方法。

现在来完成服务器端代码。因为sync方法提交数据的方式是固定的,因而提取删除数据的方式与添加和编辑操作的一样,需要从data中提取数据,然后使用parse方法转换为JArray。余下的工作就是从JArray中提取出删除数据的JObject,通过id或Username去删除用户了,具体代码如下:

public JObject
        {
string msg = "";
bool success = false;
JArray ja = null;
string data = Request["data"] ?? "";
if (string.IsNullOrEmpty(data))
            {
"错误的提交数据。";
            }
try
            {
JArray.Parse(data);
if(ja.Count > 0)
               {
foreach (JObject jo in
                   {
Membership.DeleteUser((string)jo["Username"]);
                   }
true;
               }
else
               {
"错误的提交数据。";
               }
            }
catch (Exception
            {
               msg = e.Message;
            }
return MyFunction.WriteJObjectResult(success,0, msg, ja);
        }

 

 

这里要注意的是,和添加编辑操作一样,尽管success返回true,还是要把删除的数据返回。因为删除不需要改变原有的数据,因而直接将ja返回就行了。

还有2个问题要自己考虑清楚。第1个是删除后是否提示用户已删除记录,如果需要,在sync方法内的回调函数success内加入提示信息就可以了。第2个问题是,因为删除数据后,Grid内的数据会减少,是否需要刷新页面?

最后一个功能重置密码与删除用户差不多,也是从选择模型获取选择记录。不过,这次,不能用sync同步,只能通过提取id,然后使用Ajax方法提交数据了。先为重置密码按钮绑定单击事件,代码如下:

me.getButtonUserResetPassword().on("click",me.onResetPassword, me);

接着完成onResetPassword方法,代码如下:

function
var me = this,
           rs = me.getUserView().getSelectionModel().getSelection();
if
var
for (var
               idList.push(rs[i].data.id);
            }
           Ext.Ajax.request({
               params: { id: idList },
'/Users/ResetPassword',
true,
               scope: me,
function
varobj = Ext.JSON.decode(response.responseText);
if(obj) {
if
"提示信息", "重置密码成功");
return;
else
"错误",obj.Msg);
                        }
                   }
               },
function
"错误", "重置密码失败!<br>错误信息:"
               }
           });
        }
    }

 

代码中,没有进行确认,如果需要,可自行添加。因为Ajax提交不是根据返回的success值来调用success方法或failure方法的,只要不是页面错误,都会执行回调函数success方法,因而要自己根据返回的数据,调用decode方法将数据转换为对象,然后根据success的值来做处理。

下面,完成服务器端的ResetPassword方法。在这里,有个麻烦,就是ChangePassword方法需要使用旧密码才能修改新买,而ResetPassword方法会随机生成一个密码,都不能直接将密码设置为123456,因而,需要先用ResetPassword方法重置密码后,然后利用这个重置的密码,调用ChangePassword方法将密码修改为123456,具体代码如下:

public JObject
        {
bool success=false;
string msg="";
string idList = Request["id"] ?? "";
try
            {
string[] ids = idList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var c in
               {
Guid id=Guid.Parse(c);
MembershipUser user = Membership.GetUser(id);
if(user != null)
                   {
string
"123456");
                   }
               }
true;
            }
catch (Exception
            {
                msg=e.Message;
            }
return MyFunction.WriteJObjectResult(success,0, msg, null);
 
        }

用户管理的基本功能就已经全部完成了,不过还有一个问题要解决,就是控制服务器端用户控制器的权限问题。这个在Asp.Net MVC中很容易实现,使用Authorize特性声明方法就能解决了,代码如下:

[Authorize(Roles="系统管理员")]

不过,这里存在的问题,返回的错误信息不是JSON格式的,因而在客户端处理会出问题,因而需要自定义一个返回JSON格式的认证特性。要实现这个不难,从AuthorizeAttribute派生出一个AjaxAuthorizeAttribute类,并重写HandleUnauthorizedRequest方法就可以了。

先在解决方案下添加一个名为Validations的目录。然后在该目录下添加一个名为AjaxAuthorizeAttribute.cs的类文件,生成代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
 
namespace
{
public class AjaxAuthorizeAttribute
    {
    }
}

先修改类结构,让AjaxAuthorizeAttribute类派生于AuthorizeAttribute,修改后代码如下:

public classAjaxAuthorizeAttribute : AuthorizeAttribute
    {
    }

这时会提示缺少引用,把以下引用加入就行了:

usingSystem.Web.Mvc;

 

现在,在类内添加重写HandleUnauthorizedRequest方法的代码,代码如下:

protected override voidHandleUnauthorizedRequest(AuthorizationContext
        {
        }

方法中传入的参数就是要进行验证的上下文。判断上下文中Request对象的IsAjaxRequest方法,就可知道提交的是否Ajax请求,如果是,就构造一个JSON结果返回就行了。具体代码如下:

if(filterContext.HttpContext.Request.IsAjaxRequest())
{
 
    UrlHelperurlHelper = new UrlHelper(filterContext.RequestContext);
   filterContext.Result = new JsonResult
    {
        Data= new
        {
           success = false,
           Msg = "您没有权限访问该页。"
        },
       JsonRequestBehavior = JsonRequestBehavior.AllowGet
    };
}
else
{
   base.HandleUnauthorizedRequest(filterContext);
}

好了,在控制器内加入对Validations的引用,并在所有方法上添加以下特性:

[AjaxAuthorize(Roles="系统管理员")]

 

这样,就可以控制访问权限了,要测试是否成功,可以将重置密码的那段Ajax请求复制到Firebug的命令行,把idList修改为1,删除“scope:me”。在运行前,先检查是否已经退出了系统,保证处于没登录状态。单击运行后,就看到如图30所示的结果,在Firebug内,会看到返回的结果,正是在AjaxAuthorizeAttribute类定义的返回结果。

一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)_asp.net_02

图30 测试权限

至此,用户管理功能就完成了。



标签:me,Asp,success,删除,一步,代码,用户,MVC,方法
From: https://blog.51cto.com/dqhuang/6319168

相关文章

  • 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(3)
    昨天还有一个错误,CheckColumn的样式和图片没复制过来,造成最后一列的Checkbox显示不正确。在ExtJS包的examples\ux\css目录下打开CheckHeader.css文件,将文件里的全部样式定义复制到app.css中。然后修改将带背景图片的路径修改为“../images”。最后将image目录下的check.gif和unche......
  • 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)
    现在,创建视图,在Scripts\app\view目录下先创建目录Users,然后在该目录下创建View.js。要使用Grid显示用户信息,因而要从Grid面板派生出视图。定义的时候要注意视图的类名。还有就是一定要定义别名,因为在控制器中是使用widget方法创建的视图实例。如果不想定义别名,那就要修改创建实例的......
  • 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试
         现在可以对登录窗口进行调试了。     打开系统的首页页面文件,Views\Home目录下的Index.cshtml文件。要动态加载登录窗口,需要先设置好加载路径,因而在onReady函数上加入以下代码:Ext.Loader.setConfig({true,paths:{'Ext.ux':'scripts/extjs/ux'......
  • 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(1)
    忙活了那么久,终于进入正题,ExtJSMVC开发。开始前,先说说4.1.1的一点点变化。在4.1的时候,要先创建一个扩展于Ext.app.Application的类,然后用create创建它的实例来开始应用程序的。而在4.1.1,则可直接调用application方法开始执行应用程序,简化了。调用application方法,其参数是一个配置......
  • org.apache.jasper.JasperException: /pages/role-list.jsp (行.: [145], 列: [8]) 根
    org.apache.jasper.JasperException:/pages/role-list.jsp(行.:[145],列:[8])根据标记文件中的TLD或attribute指令,attribute[items]不接受任何表达式 web.xml中版本号不兼容产生的问题;解决方法:<%@taglibprefix=“c”uri=“http://java.sun.com/jstl/core”%>改为<%@t......
  • 【源码解读】asp.net core源码启动流程精细解读
    引言core出来至今,已经7年了,我接触也已经4年了,从开始的2.1,2.2,3.1,5,6再到如今的7,一直都有再用,虽然我是一个Winform仔,但是源码一直从3.1到7都有再看,然后在QQ上面也一直比较活跃,之前好几年前一直说给大家解读asp.netcore源码,在之前的博客中,讲的都是比较粗略化的,因为东西太多......
  • ASP.NET Core 异常处理
    此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:Artech-博客园(cnblogs.com)《ASP.NETCore6框架揭秘》由于ASP.NETCore是一个同时处理多个请求的web应用框架,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止。NuGet包Microsof......
  • ASP.NET Core(一) 承载系统、管道、概述
    此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:Artech-博客园(cnblogs.com)《ASP.NETCore6框架揭秘》请务必先通读以下官网概述(15min~30min):ASP.NETCore基础知识概述|MicrosoftLearn承载系统借助.NETCore提供的承载系统(Hosting),我们可......
  • ASP.NET Core(二):IOC、DI,即依赖注入和控制反转
    此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:Artech-博客园(cnblogs.com)《ASP.NETCore6框架揭秘》整个ASP.NETCore框架建立在一个底层的依赖注入框架之上,它使用依赖注入容器提供所需的服务对象。服务服务通常由组件提供,组件可以理解成......
  • 【python】【报错:pip中第三库下载成功,但是pycharm却没有显示】一步解决
     解决方案: 直接在这个目录下安装第三方库 ......