Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)

接上篇Asp.Net大型项目实践(10)-基于MVC Action粒度的权限管理(在线demo,全部源码)

在线Demo:

地址:http://218.60.8.35:1234/

服务器:网通

端口:不要禁用1234端口应该就可以访问

注意:连了数据库的,时间仓促肯定有漏洞,不要捣乱哈:)

登录用户: 1.用户名:牛头人战士 密码:000000 权限:有全部菜单页面,不能进行数据库的更改操作(不影响录入体验)

      2.用户名:老虎MM  密码:000000  权限:少两个菜单页面,不能进行数据库的更改操作(不影响录入体验)

      3.用户名:admin 密码不公开 权限:所有权限

      注:以上的实现都是通过权限管理s配置出的哈,没有任何硬编码

权限判断的边界

由于项目是基于MVC的,除去数据权限不说,功能权限的判断边界做在MVC 的Action上无疑是最好的选择,因为无论是一个页面,还是一个按钮,还是一次查询,都是通过Action请求实现的。这样我们只需要在每个Action请求执行之前进行权限判断就可以了,也不用折腾RBAC里的资源+操作=权限 这么麻烦。

 

菜单权限和功能权限

其实在MIS项目中,大多数的权限判断粒度还是页面级的,再加上我们还需要根据权限动态生成用户的菜单,所以我们把权限分成“菜单权限”和“功能权限”

菜单权限:在用户登录验证后,每个页面的请求都必须通过权限验证。

功能权限:默认客户进入页面后,页面的相关操作默认都不判断,只对显示维护出的功能权限进行权限判断。

这样有几个好处:一般情况下权限的配置简单了,因为只需要配置粗粒度的页面权限即可使用;增加了效率,不必每个Action执行之前都判断权限(虽然都做了缓存,但能少判断一次还是好的);完全不影响细粒度的权限判断,随时都可以增加对任何一个Action的权限判定

 

如何取Action功能权限

我们通过反射把所有的Action权限全部取出来,这样在维护选取的时候就比较方便了,也不会产生录入错误,如下图:

大家用Demo可以体验到我们模糊输入Action名称就可以找到我们想要的Action的,因为是配置选取用也不用担心什么反射的效率问题,其实大家从demo可以看到速度还是挺快的,在我真实的项目中Action中有上万个,拉出来一样是瞬时的,所以我觉得有时候吧,也别过于“谈反射色变”,呵呵

通过反射获取所有Action的代码如下:

代码
public IList<ActionPermission> GetAllActionByAssembly()
{
var result
= new List<ActionPermission>();

var types
= Assembly.Load("Demo.HIS.MVC").GetTypes();

foreach (var type in types)
{
if (type.BaseType.Name == "BaseController")//如果是Controller
{
var members
= type.GetMethods();
foreach (var member in members)
{
if (member.ReturnType.Name == "ActionResult")//如果是Action
{

var ap
= new ActionPermission();

ap.ActionName
= member.Name;
ap.ControllerName
= member.DeclaringType.Name.Substring(0, member.DeclaringType.Name.Length - 10); // 去掉“Controller”后缀

object[] attrs = member.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), true);
if (attrs.Length > 0)
ap.Description
= (attrs[0] as System.ComponentModel.DescriptionAttribute).Description;

result.Add(ap);
}

}
}
}
return result;
}

返回的IList<ActionPermission>就是系统中所有Action的集合,大家可看到我们通过BaseController找到了项目中所有的Controller,再通过ActionResult找到Controller中所有的Action。

不知道大家注意下拉出的Action有个描述属性,这个属性是通过在Action上定义DescriptionAttribute实现的,这样通过反射就能取到中文描述了,例如:为了实现页面的选取方便,我们还要实现对IList<ActionPermission>的分页和模糊查询,因为是变量级集合,这里我们使用Linq查询就可以了,代码如下:

[Description("访问功能权限管理页面")]
[ViewPage]
public ActionResult ActionPermission()
{
return View();
}

 

代码
public IList<ActionPermission> QueryActionPlist(string query, int start, int limit, out long total)
{
IList
<ActionPermission> allActions = GetAllActionByAssembly();

total
= (from a in allActions
where a.ActionName.ToLower().Contains(query.ToLower())
select a).Count();

var result
= (from a in allActions
where a.ActionName.ToLower().Contains(query.ToLower())
select a).Skip(start).Take(limit);

return new List<ActionPermission>(result);
}

 

把权限判断相关的数据都缓存起来提高效率

我们把当前登录用户的:用户信息,拥有菜单权限,拥有功能权限 放在Session里

我们把需要托管的所有Action功能权限放在 Appliction全局应用程序变量里

这样我们所有的权限相关判断都是从缓存中取数据,不需要频繁访问数据了。

相关代码懒得贴了,自己去下载的源码里翻吧....注意一下缓存相关都是通过ICache这个接口出的,搜一下就能找到

 

如何对每个Action进行拦截,在它执行之前判断权限

最土的办法就是在每个Action加一段权限判断的代码,哈哈...如果我要这样做的话,估计要被大家的砖头拍死。

看过本系列Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)的朋友应该就能想到,这是一个典型的AOP应用场景。

由于Asp.net MVC的Filter机制其实就是Aop,所以我们直接使用它。熟悉Asp.net MVC的朋友估计知道里面其实自带的有一个AuthorizeAttribute的ActionFilter,但基本就是个玩具,本来我想继承它重写的,但无奈里面的filterContext没有ActionDescriptor属性,所以干脆不要它自己写个ActionFilter,代码如下:

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web;
using System.Security.Principal;
using Demo.HIS.Infrastructure.Facade.Authority;

namespace Demo.HIS.MVC.CommonSupport.Filter
{
/// <summary>
/// 权限拦截
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class AuthorizeFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var path
= filterContext.HttpContext.Request.Path.ToLower();
if (path == "/" || path == "/Main/Login".ToLower() || path == "/Main/UserLogin".ToLower())
return;//忽略对Login登录页的权限判定

object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(ViewPageAttribute), true);
var isViewPage
= attrs.Length == 1;//当前Action请求是否为具体的功能页

if (this.AuthorizeCore(filterContext, isViewPage) == false)//根据验证判断进行处理
{
//注:如果未登录直接在URL输入功能权限地址提示不是很友好;如果登录后输入未维护的功能权限地址,那么也可以访问,这个可能会有安全问题
if (isViewPage == true)
{
filterContext.Result
= new HttpUnauthorizedResult();//直接URL输入的页面地址跳转到登陆页
}
else
{
filterContext.Result
= new ContentResult { Content = @"JsHelper.ShowError('抱歉,你不具有当前操作的权限!')" };//功能权限弹出提示框
}
}
}
//权限判断业务逻辑
protected virtual bool AuthorizeCore(ActionExecutingContext filterContext, bool isViewPage)
{
if (filterContext.HttpContext == null)
{
throw new ArgumentNullException("httpContext");
}

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
return false;//判定用户是否登录
}
var user
= new CurrentUser();//获取当前用户信息
var controllerName = filterContext.RouteData.Values["controller"].ToString();
var actionName
= filterContext.RouteData.Values["action"].ToString();
if (isViewPage && (controllerName.ToLower() != "main" && actionName.ToLower() != "masterpage"))//如果当前Action请求为具体的功能页并且不是MasterPage页
{
if (user.MenuPermission.Count(m => m.ControllerName == controllerName && m.ActionName == actionName) == 0)
return false;
}
else
{
var actions
= ContainerFactory.GetContainer().Resolve<IAuthorityFacade>().GetAllActionPermission();//所有被维护的Action权限
if (actions.Count(a => a.ControllerName == controllerName && a.ActionName == actionName) != 0)//如果当前Action属于被维护的Action权限
{
if (user.ActionPermission.Count(a => a.ControllerName == controllerName && a.ActionName == actionName) == 0)
return false;
}
}
return true;
}
}
}

a.我的AuthorizeFilterAttribute继承了ActionFilterAttribute

b.重写ActionFilterAttribute的OnActionExecuting(ActionExecutingContext filterContext)方法,这个方法表示在每个Action执行之前处理

c.返回页面的Action上面要加ViewPageAttribute,这样我在Filter里才能区分当前Action是否为页面(注:由于是在Action执行之前,无法通过获取ActionResult的类型来判断)

d.权限判断和处理的逻辑自己看贴的代码里的注释,已经写的很清楚了

在哪儿加这个AuthorizeFilterAttribute呢?一个一个给Action或Controller加都太麻烦了,还记得我们所有的Controller都继承了BaseController吗?在他上面就完事了呗!这样整个系统要不权限就靠BaseController上的一个AuthorizeFilterAttribute说了算~,BaseController如下:

namespace Demo.HIS.MVC.CommonSupport
{
// 所有Controller都要继承的基类
[AuthorizeFilter]
[ExceFilter]
public class BaseController : Controller
{
}
}

 

使用FormsAuthentication实现登录验证

用户登录验证用的是.Net自带的Forms验证,它默认通过加密的cookies来实现用户的登录判断

登录代码如下:

代码
[ExtResult]
[Description(
"用户登录")]
public ActionResult UserLogin()
{
string loginName = Request["loginname"];
string pwd = HospUser.GetPwdMD5(Request["pwd"]);
if (!AuthorityFacade.Validate(loginName, pwd))
throw new ValidationException("用户名密码错误,或用户状态不可用");

FormsAuthentication.SetAuthCookie(loginName,
true);//加入from验证票据
Cache.RemoveSessionCache("currentuser");//清空当前用户信息缓存

return this.JsonFormat(new ExtResult { success = true });
}

注销代码如下:

代码
//注销登陆
public ActionResult Logout()
{
FormsAuthentication.SignOut();
Cache.RemoveSessionCache(
"currentuser");//清空当前用户信息缓存
return this.JsonFormat(new ExtResult { success = true });
}

 

大伙期待的源码

虽然是从公司实际项目中扒出来的,但整个设计,思想,架构和关键代码基本都是我一个人搞的,而且业务相关的东西我都去掉了所以大家可以随便用。

里面可能涉及到不少东西还没有讲到,在以后的系列中会详细说明。

另外有人说源码编译报错缺少“HibernatingRhinos.NHibernate.Profiler.Appender.DLL”,你可以把这个DLL删除,再根据错误信息删除一行代码即可,这个其实是之前讲过的NHProfiler,NH生成SQL查看工具用的DLL。

源码:HISDemo-10.rar

数据库(估计用SQLSERVER的比较多,所以我把数据库从oracle改成了SqlServer2005,直接附加就可以了):HISDemoDb.rar

总结

  权限管理这部分暂时就介绍到这里 ,以后有机会再给大家介绍数据权限,权限与工作流引擎集成,单点登录,多级授权等复杂的权限管理实现。大家可以看到上面介绍权限管理还是有些特点的:

1.充分利用MVC特点;

2.思路清晰;

3.验证逻辑简单;

4.维护方便;

5.没有效率问题;

6.和其他代码完全解耦毫无依赖;

7.非常灵活能满足绝大多数需求;

8.扩展方便;

我想通过这个权限管理的例子和相关讨论,大家应该明白一个道理,只有真正适合自己当前项目的业务和技术特点的技术方案才是好方案。

在技术水平有限的情况下盲目追求什么通用,什么全适应,往往实现费时费力还不讨好。

在软件开发这个领域,真正的高手不在于写高深的代码;玩弄艰涩的术语;也不会不考虑实际价值,为了用技术而用技术;也不会胡吹海吹,堕落到为了赚钱就放弃技术。

理论和实践结合才是王道

还是那两句老话,软件开发没有银弹,一切为了需求

 

写这个系列的初衷主要还是想感谢.Net技术社区里的各位朋友,长期以来大家贡献的资料文章给我的工作和学习都有很大帮助。

也是受同事 1-2-3影响,本人潜水多年突然良心发现,觉得自己也应该对.Net技术社区做一点力所能及的事,所以写下此系列。

写这玩意儿一不求出名二不求搞头衔三不求赚钱,再加上本人个性,所以写的比较随意粗糙,有时还有恶搞。哈哈,没有啥严格的排版,也没有严谨的书面用语,有时候还有点针对性,如有不适还望大家海涵

大伙捧场我就写着Happy~~

最后祝愿大家春节快乐吧,本系列春节之后再更新.....

posted on 2010-01-25 08:44 传说中的弦哥 阅读(21412) 评论(124) 编辑 收藏

评论

#25楼  回复 引用 查看   

很强大,支持。

#26楼  回复 引用 查看   

登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
2010-01-25 14:07 | 五味果      

#27楼  回复 引用 查看   

引用五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?

我也有这样的问题.
2010-01-25 14:48 | kyle_ckzx      

#28楼[楼主]  回复 引用 查看   

@五味果
@kyle_ckzx
是不是数据库没连上 debug一下
2010-01-25 14:55 | 传说中的弦哥      

#29楼  回复 引用 查看   

网页错误详细信息

用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
时间戳: Mon, 25 Jan 2010 07:06:07 UTC


消息: 'result.msg' 为空或不是对象
行: 76
字符: 14
代码: 0
URI: http://127.0.0.1/Scripts/Main/Login.aspx.js


完全的错误信息!
2010-01-25 15:06 | kyle_ckzx      

#30楼  回复 引用 查看   

提个问题,是不是每个action上都要加一个filter来控制这个action的权限?如果是,为什么不直接在ActionInvoker里实现权限控制。
2010-01-25 15:17 | Nick Wang (懒人王)      

#31楼[楼主]  回复 引用 查看   

@Nick Wang (懒人王)
引用Nick Wang (懒人王):提个问题,是不是每个action上都要加一个filter来控制这个action的权限?如果是,为什么不直接在ActionInvoker里实现权限控制。

显然不是 这位老兄明显没认真看贴
2010-01-25 15:23 | 传说中的弦哥      

#32楼  回复 引用 查看   

非常感谢弦哥分享!!

有个问题!登录(admin,其他帐号也一样)后左边的菜单不显示,直接是空的!
环境:XP,IE7,VS2008,MVC1.0,NH2.1.1(应该不会影响,只用了个查看HQL的那个DLL)
跟踪调试后发现,GetMenuTree方法中的list有6条记录,返回的JSON中也是1个对象和5个子项!

后改用 FIREFOX 居然奇迹般的好了!!Chrome还未试!
2010-01-25 15:29 | jectZhou      

#33楼[楼主]  回复 引用 查看   

@jectZhou
晕倒 IE8,IE8兼容模式,Chrome我都测试过没问题呀
你试试在线demo,如果在线demo没问题,估计还是你本地部署有问题哇
2010-01-25 16:08 | 传说中的弦哥      

#34楼  回复 引用 查看   

文盲过来支持一下楼主。
2010-01-25 16:14 | Sunny Peng      

#35楼  回复 引用 查看   

@传说中的弦哥
额 感谢弦哥!CHROME也通过!就IE7不行!在线测试也OK(IE7)!我估计也是我机器配置的问题!我再看看!谢谢!
2010-01-25 17:25 | jectZhou      

#36楼  回复 引用 查看   

看看,学习下
2010-01-25 17:27 | ddda      

#37楼  回复 引用 查看   

非常好,那个查询效果是不是也展示出来
2010-01-25 17:36 | Hillsoul      

#38楼  回复 引用 查看   

支持你!
2010-01-25 17:39 | 天赋与努力      

#39楼  回复 引用 查看   

太好了 继续学习MVC
2010-01-25 21:48 | 罩哥      

#40楼  回复 引用 查看   

弦哥问一下。。我下载你的代码里面看里面有几个关联表没有映射文件。那删除里面表的记录怎么做的。
2010-01-26 10:46 | 啊文      

#41楼  回复 引用 查看   

IE8 ,opera 10.1左侧导航显示不了.其它CHROME没有问题! 在线测试 没有问题.不知道上面的兄弟找到问题没有!
2010-01-26 11:12 | kyle_ckzx      

#42楼  回复 引用 查看   

弦哥,问一下,为什么我的老在"把Controller实例注册到了unity容器"这个地方报错,而且在IE7下面也没有数据显示.能否公开一下你的开发环境,还有一些部署要求?不胜感激!
2010-01-26 11:19 | Jerry Gao      

#43楼[楼主]  回复 引用 查看   

@啊文
引用啊文:弦哥问一下。。我下载你的代码里面看里面有几个关联表没有映射文件。那删除里面表的记录怎么做的。

NH自动的 关联表不用写映射文件
2010-01-26 12:26 | 传说中的弦哥      

#44楼[楼主]  回复 引用 查看   

@Jerry Gao
引用Jerry Gao:弦哥,问一下,为什么我的老在"把Controller实例注册到了unity容器"这个地方报错,而且在IE7下面也没有数据显示.能否公开一下你的开发环境,还有一些部署要求?不胜感激!

把Controller实例注册到了unity容器报错 这个没关系的,主要由于引用的js或css找不到引起的,不影响
浏览器兼容问题 我的demo是对的呀,我demo和放出的源码是同一套代码
2010-01-26 12:27 | 传说中的弦哥      

#45楼  回复 引用 查看   

同样的问题,在IE下左边的菜单出不来,谷歌浏览器可以显示。
2010-01-27 15:14 | 程式人生2004      

#46楼  回复 引用 查看   

永远支持跟宇宙一样强大的弦哥!
2010-01-28 00:56 | xuefly      

#47楼  回复 引用 查看   

引用kyle_ckzx:
引用五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?

我也有这样的问题.

我也有这样的问题,我的是Ie8+vs2008+sql2005
2010-01-28 13:07 | 小贩      

#48楼  回复 引用 查看   

引用小贩:
引用kyle_ckzx:
引用五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?

我也有这样的问题.

我也有这样的问题,我的是Ie8+vs2008+sql2005

这个应该是IIS的问题,搜一下IIS怎么配置MVC。
2010-01-31 12:32 | dfsoft      

#49楼[楼主]  回复 引用 查看   

@小贩
@kyle_ckzx
把项目在IIS里配置成一个网站 而不是网站下的子目录
2010-01-31 22:24 | 传说中的弦哥      

#50楼  回复 引用 查看   

引用小贩:
引用kyle_ckzx:
引用五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?

我也有这样的问题.

我也有这样的问题,我的是Ie8+vs2008+sql2005




我的也有相同的问题,但肯定不是数据库连接的问题,不知道什么源因
2010-02-01 14:17 | L!ang      

#51楼  回复 引用 查看   

顶一下 LZ
2010-02-01 18:16 | 妖*小夜      

#52楼  回复 引用 查看   

file:///C:/Documents%20and%20Settings/Administrator/桌面/1.jpg
2010-02-02 17:25 | 在路上。。。      

#53楼  回复 引用 查看   

炫哥:
Default页的 httpHandler.ProcessRequest(HttpContext.Current);报错如下;
找不到方法:“System.Web.Mvc.ActionDescriptor System.Web.Mvc.ActionExecutedContext.get_ActionDescriptor()”。

为什么 小菜不会
2010-02-02 17:27 | 在路上。。。      

#54楼  回复 引用 查看   

用IIS网站配置你默认的8008端口来打开网站有问题,点了登陆没反映了。

后来用VS2008开发服务器来打开,登陆正常了。

这是什么问题?请问IIS需要怎么配置才可以呢?
2010-02-08 16:03 | icewater      

#55楼  回复 引用 查看   

你好!下载了你的项目,杂怎么都调试不了,总是加载不了DemoHisSite
项目,出错为尚未配置DemoHisSite为虚拟目录,为什么在vs中调试也要配置虚拟目录,期待大哥,指点。。谢谢!!
2010-02-19 13:45 | 舞之鑫      

#56楼  回复 引用 查看   

@舞之鑫
我发现VS使用.NET Framework提供的那个开发用的IIS运行的话在IE下有问题,MasterPage左面的导航树出不来。可能是因为这样弦哥配置成使用IIS的,再说使用自带的那个开发用的IIS占内存,还是直接用真实环境的IIS比较好。
解决你的问题可以:用VS打开解决方案,右键未成功加载那个项目 => 编辑项目文件 => 修改如下配置节点
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>1986</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:8080</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
在IIS中建立相应的WebSiteApp,然后右键重新加载那个未成功加载的项目。

弦哥快点写啊,我假期看了两本ExtJs的书就为关注你接下来的系列呢^_^
2010-02-20 19:41 | xuefly      

#57楼  回复 引用 查看   

DemoHisSite,不好加载,于是用记事本改了url,可以载入了;但是运行时,提示:服务器应用程序不可用
我的IIS是5.1
2010-02-21 11:41 | 羲之非王      

#58楼  回复 引用 查看   

期待后续呀
2010-02-21 16:48 | 羲之非王      

#59楼  回复 引用 查看   

把 <IISUrl>http://localhost:8080</IISUrl> 删除就可以了撒。
。。。。。。。


我天天来看!
玄哥 不更新。。心里挖凉挖凉的。。。把之前的看了好几篇 每次都有新收获
2010-02-22 15:42 | show_show      

#60楼  回复 引用 查看   

警告 1 元素 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“PropertyGroup”。 的子元素 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“MvcBuildViews”。 无效。应为可能元素的列表: 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“Property”。。 D:\Downloads\HISDemo\DemoHisSite\DemoHisSite.csproj 14 6 杂项文件
错误 2 当前上下文中不存在名称“HibernatingRhinos” D:\Downloads\HISDemo\Demo.HIS.FrameWork\Repository\Nhb\SessionBuilder.cs 19 13 Demo.HIS.FrameWork
错误 3 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Core
错误 4 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Repositories
错误 5 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Repositories
错误 6 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Facade
错误 7 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Repositories\bin\Debug\Infrastructure.Repositories.dll” Infrastructure.Facade
错误 8 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Facade
错误 9 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Facade\bin\Debug\Infrastructure.Facade.dll” Demo.HIS.MVC
错误 10 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Demo.HIS.MVC
错误 11 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Demo.HIS.MVC
2010-02-23 17:08 | assiwe      

#61楼  回复 引用 查看   

这是怎么回事啊?
2010-02-23 17:09 | assiwe      

#62楼  回复 引用 查看   

为什么我的在输入用户和密码后点击登陆就会报这个错:
HospUser is not mapped [select count(u) from HospUser as u
where u.LoginName=:LoginName and u.Pwd=:Pwd and u.State=:State] 在验证用户名与密码是否正确的地方报这个错,找了好久,郁闷,请高手帮忙解决一下...
2010-02-27 09:23 | Jerry Gao      

#63楼  回复 引用 查看   

@Jerry Gao
public bool IsExistUser(string userid, string password)
{
var query = Session.CreateQuery(@"select count(*) from UserInfo as u "
+ "where u.UserId=:U and u.PassWord=:P")
.SetString("U", userid)
.SetString("P", password);

return query.UniqueResult<long>() > 0;
}

我是这样的
2010-03-03 17:36 | show_show      

#64楼  回复 引用 查看   

玄哥, 我将WEB改成IIS,不用VS默认的,之后就报如下错误:

“/DemoHisSite”应用程序中的服务器错误。
--------------------------------------------------------------------------------

The current type, DemoHisSite.Controllers.IFormsAuthentication, is an interface and cannot be constructed. Are you missing a type mapping?

但如果用VS默认的WebServer就不会报错,只是用IE7浏览的时候,没有导航菜单,用Firefox倒是可以浏览。

除了上面的错误外,我想请教下:这种MVC程序的发布要如注意什么,现在开发都用VS默认的来调试,等发布的时候,出现很多莫名的错误,很是头大,请玄哥指点指点
2010-03-08 23:37 | napo cheng      

#65楼  回复 引用 查看   

一直想看,一直没时间看,哪曾想看了之后,迎接我的是震撼。
2010-03-12 16:45 | Roy Ming      

#66楼  回复 引用 查看   

弦哥你贼猛啊!!

噢!!!!小菜与弦哥一同加油!
2010-03-15 11:42 | .NET*DR_      

#67楼  回复 引用 查看   

弦哥:代码如尿崩,谁与我争疯

获取猛码 | 获取猛库
2010-03-15 11:44 | .NET*DR_      

#68楼  回复 引用 查看   

我打开项目的时候出现:
一张图片
http://hi.baidu.com/a_xinno1/album/item/9a67ab89d085b324c9fc7a20.html[/img]

System.Runtime.InteropServices.COMException这样的错,
当我点击确定时,
一张图片http://hi.baidu.com/a_xinno1/album/item/9a67ab89d085b324c9fc7a20.html#IMG=8760d026048d9d1dd5074220[/img]
2010-03-23 12:38 | aXinNo1      

#69楼  回复 引用 查看   

我的环境是:vs2008,mvc是1.0版本的
2010-03-23 12:45 | aXinNo1      

#70楼  回复 引用 查看   

持续关注中...怎么弦哥还没有更新?
2010-03-24 16:58 | Jerry Gao      

#71楼  回复 引用 查看   

我下载下来都部署不了,晕死
2010-03-24 17:00 | aXinNo1      

#72楼  回复 引用 查看   

@传说中的弦哥

Asp.net MVC + ExtJs 可以实现自定义表单吗?
2010-03-26 10:39 | Jerry Gao      

#73楼  回复 引用 查看   

什么时候更新阿?等了n天(n>15)了
2010-04-19 17:41 | goodday2      

#74楼  回复 引用 查看   

继续等待
2010-05-16 00:10 | show_show      

#75楼  回复 引用 查看   

“最后祝愿大家春节快乐吧,本系列春节之后再更新.....”

春节都过去好几个月了,请问您的更新在哪里呢?
2010-05-20 10:42 | 金色海洋(jyk)      

#76楼  回复 引用 查看   

为什么我用chrome浏览器有时候可以显示菜单,有时候又不可以显示菜单,用IE根本就不能显示菜单,你说里面默认是把菜单给隐藏的,是通过什么参数呢。谢谢
2010-06-08 11:28 | apcel      

#77楼  回复 引用 查看   

还有,接下来的什么时候更新呀,很是期待。。。。。努力。。。。。。。
2010-06-08 11:30 | apcel      

#78楼  回复 引用 查看   

引用传说中的弦哥:
@jectZhou
晕倒 IE8,IE8兼容模式,Chrome我都测试过没问题呀
你试试在线demo,如果在线demo没问题,估计还是你本地部署有问题哇

我试过了,在线demo和本地部署都是一样的结果,没有菜单,这是为什么呢
2010-06-08 11:37 | apcel      

#79楼  回复 引用 查看   

力挺弦哥
2010-07-02 18:27 | 尛 航      

#80楼  回复 引用 查看   

这句老是抛出异常啊
IController icontroller = container.Resolve(controllerType) as IController;
在线的也出不了菜单,firefox提示admin也无权限啊
unity不太懂,谁给说说怎么搞啊
2010-07-05 17:36 | eyangs      

#81楼  回复 引用 查看   

大哥哥
数据库连接在哪儿配置
hibernate.cfg.xml
这个文件修改了不管用。
2010-07-12 19:09 | onlyugly      

#82楼  回复 引用 查看   

继续等待
2010-07-16 13:54 | show_show      

#83楼  回复 引用 查看   

必须顶一下!
2010-07-16 14:57 | imap      

#84楼  回复 引用 查看   

顶一下!源码不能下载了?
2010-07-20 23:03 | Jason3      

#85楼  回复 引用 查看   

学习学习。
2010-07-23 14:59 | LoveFish      

#86楼  回复 引用 查看   

楼主很强大
2010-07-26 14:14 | LoveFish      

#87楼  回复 引用 查看   

错误 1 当前上下文中不存在名称“HibernatingRhinos” F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\Repository\Nhb\SessionBuilder.cs 19 13 Demo.HIS.FrameWork
错误 2 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Core
错误 3 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Repositories
错误 4 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Repositories
错误 5 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Facade
错误 6 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Facade
错误 7 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Repositories\bin\Debug\Infrastructure.Repositories.dll” Infrastructure.Facade
错误 8 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Facade\bin\Debug\Infrastructure.Facade.dll” Demo.HIS.MVC
错误 9 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Demo.HIS.MVC
错误 10 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Demo.HIS.MVC
错误 11 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.MVC\bin\Debug\Demo.HIS.MVC.dll” DemoHisSite
错误 12 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” DemoHisSite
错误 13 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” DemoHisSite
错误 14 未能找到元数据文件“F:\code\extjs\HISDemo-10\HISDemo\Infrastructure.Repositories\bin\Debug\Infrastructure.Repositories.dll” DemoHisSite

有没有谁碰到这个问题?
2010-08-02 18:00 | mu_sking      

#88楼  回复 引用 查看   

为什么我登录进去后看不到左侧的菜单?IE8 or Google浏览器
2010-08-07 14:32 | Jamie      

#89楼  回复 引用 查看   

弦哥 一直在等你更新

下面 我对有的童鞋 要说下注意的地方
1.项目是绑定了IIS 的 Web项目可能加载不进来 需要删掉IIS配置

2.to_date 函数好像是 ORACLE下面的 SQL 需要更改 一下转换函数

3.项目架构非常大 不一定适合自己的项目 但是肯定是 学习的好资料

4.EXT写起来很烦人 不过只要自己写一个 grid 和 win 其他的基本上也就是 复制修改了


嘿嘿 感谢 弦哥 学到很多 接下来深入研究 AOP

希望你早日回来
2010-08-07 17:22 | show_show      

#90楼  回复 引用 查看   

引用eyangs:
这句老是抛出异常啊
IController icontroller = container.Resolve(controllerType) as IController;
unity不太懂,谁给说说怎么搞啊


我也遇到这个问题。怎么解决的呀,没有明白。跟踪也不明白意思。急呀。
2010-08-14 11:52 | kwame      

#91楼  回复 引用 查看   

弦哥,等此贴经年了
2010-08-30 13:25 | LoveFish      

#92楼  回复 引用 查看   

我下载了怎么不能解压啊
2010-09-05 22:03 | ? love you      

#93楼  回复 引用 查看   

good!
2010-09-08 14:03 | 香炮      

#94楼  回复 引用 查看   

为什么每次我下载都解压不了呀,
2010-11-01 16:07 | ATATA      

#95楼  回复 引用 查看   

哎呀又可以解压了,对了你有oracle的怎么不上传上来呀,
2010-11-01 16:16 | ATATA      

#96楼  回复 引用 查看   

HibernatingRhinos.NHibernate.Profiler.Appender
2010-11-01 16:36 | ATATA      

#97楼  回复 引用 查看   

引用在技术水平有限的情况下盲目追求什么通用,什么全适应,往往实现费时费力还不讨好。
2010-11-23 19:48 | tonycol      

#98楼  回复 引用 查看   

非常感谢博主的分享,最近也正在思考这个问题,算是在博主这里找到了一个解决方法。十分感谢。
2010-12-23 09:06 | Michael Zhang x      

#99楼  回复 引用 查看   

我有个问题想请教下你:就是登录成功但没有权限操作某个Action的时候,假如:~/News/Details/1( 这个页面显示编号为1的新闻的详细),如果没权限的话我希望只弹出一消息框告之没权限操作,但是不希望页面再跳转了,该怎么做呢?
2011-01-14 15:45 | webaspx      

#100楼  回复 引用 查看   

看完了,留名,感謝
2011-03-04 15:15 | 注冊瞌睡      

#101楼  回复 引用 查看   

@assiwe
我也遇到这种问题 你解决了吗
2011-03-07 10:11 | jesus7_w      

#102楼  回复 引用 查看   

@mu_sking
强大的楼主 ,87 楼那有解决方案不 咯 ?
2011-03-07 10:18 | jesus7_w      

#103楼  回复 引用 查看   

@jesus7_w
解决了
2011-03-07 22:11 | assiwe      

#104楼  回复 引用 查看   

弦哥威武啊,我这边也都是做HIS的。
你那个服务器的啊?
2011-03-09 10:03 | 貓崽      

#105楼  回复 引用 查看   

IE下菜单无法显示的朋友,请打开Scripts/Main/MasterPage.aspx.js

loader : new Ext.tree.TreeLoader({
dataUrl : '/Main/GetMenuTree'
}),
替换成
loader: new Ext.tree.TreeLoader({ url: '/Main/GetMenuTree', listeners: {
"loadexception": function(loader, node, response) {
node.loaded = false;
node.reload.defer(10, node); //不停的加载,直到true
}
}
}),

至于原因自己谷歌去
2011-03-09 11:19 | 貓崽      

#106楼  回复 引用 查看   

急等弦哥更新啊
2011-03-14 00:01 | NicolasZhang      

#107楼  回复 引用 查看   

十万火急,等待弦哥更新!
2011-03-22 14:53 | 老树咖啡      

#108楼  回复 引用 查看   

定你不错 太厉害了 交个朋友吧
2011-03-27 22:59 | gongzhw      

#109楼  回复 引用 查看   

protected override IController GetControllerInstance(Type controllerType)
{
//这里把Controller实例注册到了unity容器
IController icontroller = container.Resolve(controllerType) as IController;
return icontroller;
}


运行到这里报错,是什么原因
2011-04-15 16:50 | 天际云      

#110楼  回复 引用 查看   

报这个错误呢?有人解决吗?
{"Resolution of the dependency failed, type = \"\", name = \"\". Exception message is: The current build operation (build key Build Key[, null]) failed: Cannot extract type from build key Build Key[, null].\r\n参数名: buildKey (Strategy type LifetimeStrategy, index 2)"}
2011-04-29 14:58 | 苗传兴      

#111楼  回复 引用 查看   

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)

源错误:


行 28: private void initApplicationCache()
行 29: {
行 30: ContainerFactory.GetContainer().Resolve<IAuthorityFacade>().GetAllActionPermission();//所有被维护的Action权限
行 31: }
行 32: private void initSessionBuilder()

源文件: D:\test\基于MVC Action粒度的权限管理\HISDemo-10\Demo.HIS.MVC\DemoHISApplication.cs 行: 30
2011-04-29 15:17 | 苗传兴      

#112楼  回复 引用 查看   

楼主能把ORACLE数据库上传一下么?
2011-05-13 13:54 | windlearn      

#113楼  回复 引用 查看   

用户代码未处理 Microsoft.Practices.Unity.ResolutionFailedException
Message=Resolution of the dependency failed, type = "", name = "". Exception message is: The current build operation (build key Build Key[, null]) failed: Cannot extract type from build key Build Key[, null].
参数名: buildKey (Strategy type LifetimeStrategy, index 2)
Source=Microsoft.Practices.Unity
StackTrace:
在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name)
在 Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name)
在 Microsoft.Practices.Unity.UnityContainerBase.Resolve(Type t)
在 Demo.HIS.MVC.CommonSupport.UnityControllerFactory.GetControllerInstance(Type controllerType) 位置 C:\项目开发\HISDemo\Demo.HIS.MVC\CommonSupport\UnityControllerFactory.cs:行号 22
在 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
在 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)
在 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)
在 System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext)
在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
InnerException: Microsoft.Practices.ObjectBuilder2.BuildFailedException
Message=The current build operation (build key Build Key[, null]) failed: Cannot extract type from build key Build Key[, null].
参数名: buildKey (Strategy type LifetimeStrategy, index 2)
Source=Microsoft.Practices.ObjectBuilder2
BuildKey=Build Key[, null]
ExecutingStrategyIndex=2
ExecutingStrategyTypeName=LifetimeStrategy
StackTrace:
在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
在 Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing)
在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
InnerException: System.ArgumentException
Message=Cannot extract type from build key Build Key[, null].
参数名: buildKey
Source=Microsoft.Practices.ObjectBuilder2
ParamName=buildKey
StackTrace:
在 Microsoft.Practices.ObjectBuilder2.BuildKey.GetType(Object buildKey)
在 Microsoft.Practices.ObjectBuilder2.LifetimeStrategy.GetLifetimePolicy(IBuilderContext context)
在 Microsoft.Practices.ObjectBuilder2.LifetimeStrategy.PreBuildUp(IBuilderContext context)
在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
InnerException:
2011-05-14 16:39 | gongzhw      

#114楼  回复 引用 查看   

我调试出现这个错误 登录不了 说msg null
2011-05-14 16:40 | gongzhw      

#115楼  回复 引用 查看   

利用vs2008 或者 vs2010 都打不开webSite那个(文件夹)项目
请问你怎么 回事
怎么解决啊?
2011-07-15 15:18 | wangyue1987      

#116楼  回复 引用 查看   

错误: 'result.msg' 为空或不是对象
怎么解决?

同问,IE8+XP

登录时出现,然后无反映
2011-07-15 16:39 | 我叶开      

#117楼  回复 引用 查看   

@我叶开

我发现用vs直接调试可以打开 不报错误,可以登录,如果用iis配置起来运行就报这个错误
2011-07-26 11:21 | gongzhw      

#118楼  回复 引用 查看   

分享是快乐的。
2011-10-12 09:30 | 我叫宋      

#119楼  回复 引用 查看   

不错,伟大!
2011-10-14 22:17 | HMQ      

#120楼  回复 引用 查看   

vs2010不能打开项目啊,提示需要配置虚拟什么什么的
2011-10-15 17:19 | HMQ      

#121楼  回复 引用 查看   

编译通过,没有任何错误,但是为什么刷不出菜单啊,左边的菜单导航中是空白
2011-11-13 17:34 | hhgang_01      

#122楼  回复 引用 查看   

如果我返回的不是 不是ActionResult而是....JosnResult,FileResult...更或者是其它的类型呢,是不是这样有点局限?
2011-11-17 16:24 | darjuan      

#123楼[楼主]  回复 引用 查看   

@darjuan
引用darjuan:如果我返回的不是 不是ActionResult而是....JosnResult,FileResult...更或者是其它的类型呢,是不是这样有点局限?


无论JosnResult,FileResult还是你自己定义的Result都是继承于ActionResult这个抽象类的 所以你的问题不成立....
2011-11-17 18:25 | 传说中的弦哥      

#124楼  回复 引用 查看   

弦哥,请问下我引用了你的Ext.data.StoreOverride.js,Ext.form.Action.LoadOverride.js文件

form.form.on('beforeSetafterLoad', function(data){
//这里执行不到是什么原因
});
form.form.load(formLoadArgs);
2011-12-10 17:26 | self      
评论共2页: 上一页 1 2 

导航

公告



最近在读的书
昵称:传说中的弦哥
园龄:2年2个月
荣誉:推荐博客
粉丝:457
关注:8

随笔分类

随笔档案

积分与排名

  • 积分 - 180342
  • 排名 - 477

最新评论

阅读排行榜

评论排行榜

推荐排行榜