当前位置: 首页 > news >正文

成都创意网站设计网页打不开微信可以上什么原因

成都创意网站设计,网页打不开微信可以上什么原因,青岛房产,卢松松外链工具BrnShop开源网上商城第二讲#xff1a;ASP.NET MVC框架 原文:BrnShop开源网上商城第二讲#xff1a;ASP.NET MVC框架在团队设计BrnShop的web项目之初#xff0c;我们碰到了两个问题#xff0c;第一个是数据的复用和传递#xff0c;第二个是大mvc框架和小mvc框架的选择。下… BrnShop开源网上商城第二讲ASP.NET MVC框架 原文:BrnShop开源网上商城第二讲ASP.NET MVC框架  在团队设计BrnShop的web项目之初我们碰到了两个问题第一个是数据的复用和传递第二个是大mvc框架和小mvc框架的选择。下面我依次来说明下。       首先是数据的复用和传递对于BrnShop的每一次请求程序都要分成好几个阶段执行例如验证执行动作方法等等在各个阶段我们可能需要重复使用同一信息而我们的愿景就是希望此信息只需获取一次然后沿着流程管道一直流动这样在后面的阶段中就可以直接使用不用再重新获取了提高程序的性能。举例来说在授权验证阶段我们为对用户进行验证从而获取了用户信息当验证结束后此用户信息并不被抛弃而是保留下来这样在后面的动作方法中我们就不需要再次获取用户信息而是直接使用刚才在授权中保留下来的用户信息就可以了。   具体实现是这样的首先我们给这些需要公用的数据定义个上下文类它们分别是BrnShop.Web.Framework项目中的WebWorkContext类和AdminWorkContext类其中WebWorkContext是前台项目使用的上下文AdminWorkContext是后台项目使用的上下文。代码很简单就是定义了一些公共字段具体如下 using System; using System.Collections.Generic;using BrnShop.Core;namespace BrnShop.Web.Framework {/// summary/// 商城前台工作上下文类/// /summarypublic class WebWorkContext{public ShopConfigInfo ShopConfig BSPConfig.ShopConfig;//商城配置信息public bool IsHttpAjax;//当前请求是否为ajax请求public string IP;//用户ippublic RegionInfo Region;//区域信息public string Url;//当前urlpublic string UrlReferrer;//上一次访问的urlpublic string Sid;//用户sidpublic int Uid -1;//用户idpublic string UserName;//用户名public string UserEmail;//用户邮箱public string UserMobile;//用户手机号public string NickName;//用户昵称public string Avatar;//用户头像public string Password;//用户密码public string PayCreditName;//支付积分名称public int PayCreditCount 0;//支付积分数量public string RankCreditName;//等级积分名称public int RankCreditCount 0;//等级积分数量public PartUserInfo PartUserInfo;//用户信息public int UserRid -1;//用户等级idpublic UserRankInfo UserRank;//用户等级信息public string UserRTitle;//用户等级标题public int AdminGid -1;//用户管理员组idpublic AdminGroupInfo AdminGroup;//用户管理员组信息public string AdminGTitle;//管理员组标题public string Controller;//控制器public string Action;//动作方法public string PageKey;//页面标示符public string ThemeName;//当前主题名称public string ImageDir;//图片目录public string CSSDir;//css目录public string ScriptDir;//脚本目录public int OnlineUserCount 0;//在线总人数public int OnlineMemberCount 0;//在线会员数public int OnlineGuestCount 0;//在线游客数public string SearchWord;//搜索词public int SCProductCount 0;//购物车中商品数量public ListCategoryInfo CategoryList;//分类列表public ListNavInfo NavList;//导航列表public FriendLinkInfo[] FriendLinkList;//友情链接列表public ListHelpInfo HelpList;//帮助列表public DateTime StartExecuteTime;//页面开始执行时间public double ExecuteTime;//页面执行时间public int ExecuteCount 0;//执行的sql语句数目public string ExecuteDetail;//执行的sql语句细节public string ShopVersion BSPVersion.SHOP_VERSION;//商城版本public string ShopCopyright BSPVersion.SHOP_COPYRIGHT;//商城版权 } } View Code using System;using BrnShop.Core;namespace BrnShop.Web.Framework {/// summary/// 商城后台工作上下文类/// /summarypublic class AdminWorkContext{public ShopConfigInfo ShopConfig BSPConfig.ShopConfig;//商城配置信息public bool IsHttpAjax;//当前请求是否为ajax请求public string IP;//用户ippublic RegionInfo Region;//区域信息public string Url;//当前urlpublic string UrlReferrer;//上一次访问的urlpublic string Sid;//用户sidpublic int Uid -1;//用户idpublic string UserName;//用户名public string UserEmail;//用户邮箱public string UserMobile;//用户手机号public string NickName;//用户昵称public string Avatar;//用户头像public string Password;//用户密码public PartUserInfo PartUserInfo;//用户信息public int UserRid -1;//用户等级idpublic UserRankInfo UserRank;//用户等级信息public string UserRTitle;//用户等级标题public int AdminGid -1;//用户管理员组idpublic AdminGroupInfo AdminGroup;//用户管理员组信息public string AdminGTitle;//管理员组标题public string Controller;//控制器public string Action;//动作方法public string PageKey;//页面标示符} } View Code    有了上下文类后我们需要找一个可以保证上下文流动的地方。在翻看了asp.net mvc的源码后我们找到一个好地方这个地方就在控制器的基类Controller中。在Controller中微软定义了六个方法具体如下 protected override void Initialize(RequestContext requestContext);说明初始化调用构造函数后可能不可用的数据。protected virtual void OnAuthorization(AuthorizationContext filterContext);说明在进行授权时调用。protected virtual void OnActionExecuted(ActionExecutedContext filterContext);说明在调用操作方法后调用。protected virtual void OnActionExecuting(ActionExecutingContext filterContext);说明在调用操作方法前调用。protected virtual void OnResultExecuted(ResultExecutedContext filterContext);说明在执行由操作方法返回的操作结果后调用。protected virtual void OnResultExecuting(ResultExecutingContext filterContext);说明在执行由操作方法返回的操作结果前调用。  这些都是虚方法所以我们可以定义一个继承自Controller的新控制器然后重写这些方法。由于这些方法是在同一个类中所以它们可以共享同一个字段(这个字段就是上下文)而且其他的控制器都是继承自这个新控制器类所以在动作方法中也是可以访问这个共享字段(父类的字段)。新控制器类分别是BrnShop.Web.Framework项目中BaseWebController类和BaseAdminController类其中BaseWebController为前台控制器类BaseAdminController为后台控制器类具体实现如下 using System; using System.Text; using System.Web.Mvc; using System.Web.Routing; using System.Collections.Generic;using BrnShop.Core; using BrnShop.Services;namespace BrnShop.Web.Framework {/// summary/// 商城前台基础控制器类/// /summarypublic class BaseWebController : Controller{//工作上下午public WebWorkContext WorkContext new WebWorkContext();protected override void Initialize(RequestContext requestContext){base.Initialize(requestContext);WorkContext.IsHttpAjax WebHelper.IsAjax();WorkContext.IP WebHelper.GetIP();WorkContext.Region Regions.GetRegionByIP(WorkContext.IP);WorkContext.Url WebHelper.GetUrl();WorkContext.UrlReferrer WebHelper.GetUrlReferrer();//获得用户唯一标示符sidWorkContext.Sid ShopUtils.GetSidCookie();if (WorkContext.Sid.Length 0){//生成sidWorkContext.Sid Sessions.GenerateSid();//将sid保存到cookie中ShopUtils.SetSidCookie(WorkContext.Sid);}PartUserInfo partUserInfo;//获得用户idint uid ShopUtils.GetUidCookie();if (uid 1)//当用户为游客时{//创建游客partUserInfo Users.CreatePartGuest();}else//当用户为会员时{//获得保存在cookie中的密码string password ShopUtils.GetPasswordCookie();//防止用户密码被篡改为危险字符if (password.Length 0 || !SecureHelper.IsBase64String(password)){//创建游客partUserInfo Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie();}else{partUserInfo Users.GetPartUserByUidAndPwd(uid, password);if (partUserInfo ! null){//发放登陆积分Credits.SendLoginCredits(ref partUserInfo, DateTime.Now);}else//当会员的账号或密码不正确时将用户置为游客{partUserInfo Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie();}}}//设置用户等级if (UserRanks.IsBanUserRank(partUserInfo.UserRid) partUserInfo.LiftBanTime DateTime.Now){UserRankInfo userRankInfo UserRanks.GetUserRankByCredits(partUserInfo.PayCredits);Users.UpdateUserRankByUid(partUserInfo.Uid, userRankInfo.UserRid);partUserInfo.UserRid userRankInfo.UserRid;}WorkContext.PartUserInfo partUserInfo;WorkContext.Uid partUserInfo.Uid;WorkContext.UserName partUserInfo.UserName;WorkContext.UserEmail partUserInfo.Email;WorkContext.UserMobile partUserInfo.Mobile;WorkContext.Password partUserInfo.Password;WorkContext.NickName partUserInfo.NickName;WorkContext.Avatar partUserInfo.Avatar;WorkContext.PayCreditName Credits.PayCreditName;WorkContext.PayCreditCount partUserInfo.PayCredits;WorkContext.RankCreditName Credits.RankCreditName;WorkContext.RankCreditCount partUserInfo.RankCredits;WorkContext.UserRid partUserInfo.UserRid;WorkContext.UserRank UserRanks.GetUserRankById(partUserInfo.UserRid);WorkContext.UserRTitle WorkContext.UserRank.Title;//设置用户管理员组WorkContext.AdminGid partUserInfo.AdminGid;WorkContext.AdminGroup AdminGroups.GetAdminGroupById(partUserInfo.AdminGid);WorkContext.AdminGTitle WorkContext.AdminGroup.Title;//设置当前控制器类名WorkContext.Controller RouteData.Values[controller].ToString().ToLower();//设置当前动作方法名WorkContext.Action RouteData.Values[action].ToString().ToLower();WorkContext.PageKey string.Format(/{0}/{1}, WorkContext.Controller, WorkContext.Action);//当前商城主题名称WorkContext.ThemeName WorkContext.ShopConfig.ThemeName;//设置图片目录WorkContext.ImageDir string.Format({0}/Themes/{1}/Images, WorkContext.ShopConfig.ImageCDN, WorkContext.ThemeName);//设置css目录WorkContext.CSSDir string.Format({0}/Themes/{1}/CSS, WorkContext.ShopConfig.CSSCDN, WorkContext.ThemeName);//设置脚本目录WorkContext.ScriptDir string.Format({0}/Scripts, WorkContext.ShopConfig.ScriptCDN);//在线总人数WorkContext.OnlineUserCount OnlineUsers.GetOnlineUserCount();//在线游客数WorkContext.OnlineGuestCount OnlineUsers.GetOnlineGuestCount();//在线会员数WorkContext.OnlineMemberCount WorkContext.OnlineUserCount - WorkContext.OnlineGuestCount;//搜索词WorkContext.SearchWord string.Empty;//购物车中商品数量WorkContext.SCProductCount Orders.GetShopCartProductCountCookie();//分类列表WorkContext.CategoryList Categories.GetCategoryList();//设置导航列表WorkContext.NavList Navs.GetNavList();//设置友情链接列表WorkContext.FriendLinkList FriendLinks.GetFriendLinkList();//设置帮助列表WorkContext.HelpList Helps.GetHelpList();}protected override void OnAuthorization(AuthorizationContext filterContext){//不能应用在子方法上if (filterContext.IsChildAction)return;//商城已经关闭if (WorkContext.ShopConfig.IsClosed 1 WorkContext.AdminGid 1 WorkContext.PageKey ! /account/login WorkContext.PageKey ! /account/logout){filterContext.Result PromptView(WorkContext.ShopConfig.CloseReason);return;}//当前时间为禁止访问时间if (ValidateHelper.BetweenPeriod(WorkContext.ShopConfig.BanAccessTime) WorkContext.AdminGid 1 WorkContext.PageKey ! /account/login WorkContext.PageKey ! /account/logout){filterContext.Result PromptView(当前时间不能访问本商城);return;}//当用户ip在被禁止的ip列表时if (ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.BanAccessIP)){filterContext.Result PromptView(您的IP被禁止访问本商城);return;}//当用户ip不在允许的ip列表时if (!string.IsNullOrEmpty(WorkContext.ShopConfig.AllowAccessIP) !ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.AllowAccessIP)){filterContext.Result PromptView(您的IP被禁止访问本商城);return;}//当用户IP被禁止时if (BannedIPs.CheckIP(WorkContext.IP)){filterContext.Result PromptView(您的IP被禁止访问本商城);return;}//当用户等级是禁止访问等级时if (WorkContext.UserRid 1){filterContext.Result PromptView(您的账号当前被锁定,不能访问);return;}//判断目前访问人数是否达到允许的最大人数if (WorkContext.OnlineUserCount WorkContext.ShopConfig.MaxOnlineCount WorkContext.AdminGid 1 (WorkContext.Controller ! account (WorkContext.Action ! login || WorkContext.Action ! logout))){filterContext.Result PromptView(商城人数达到访问上限, 请稍等一会再访问);return;}}protected override void OnActionExecuting(ActionExecutingContext filterContext){//不能应用在子方法上if (filterContext.IsChildAction)return; #if DEBUG//清空执行的sql语句数目RDBSHelper.ExecuteCount 0;//清空执行的sql语句细节RDBSHelper.ExecuteDetail ; #endif//页面开始执行时间WorkContext.StartExecuteTime DateTime.Now;//当用户为会员时,更新用户的在线时间if (WorkContext.Uid 0)Users.UpdateUserOnlineTime(WorkContext.Uid);//更新在线用户Asyn.UpdateOnlineUser(WorkContext.Uid, WorkContext.Sid, WorkContext.IP, WorkContext.Region.RegionId);//更新PV统计if (WorkContext.ShopConfig.UpdatePVStatTimespan ! 0)Asyn.UpdatePVStat(WorkContext.Uid, WorkContext.Region.RegionId, WebHelper.GetBrowserType(), WebHelper.GetOSType());}protected override void OnActionExecuted(ActionExecutedContext filterContext){//不能应用在子方法上if (filterContext.IsChildAction)return; #if DEBUG//执行的sql语句数目WorkContext.ExecuteCount RDBSHelper.ExecuteCount;//执行的sql语句细节if (RDBSHelper.ExecuteDetail string.Empty)WorkContext.ExecuteDetail 当前页面没有和数据库的任何交互;elseWorkContext.ExecuteDetail div数据查询分析:/div RDBSHelper.ExecuteDetail; #endif//页面执行时间WorkContext.ExecuteTime DateTime.Now.Subtract(WorkContext.StartExecuteTime).TotalMilliseconds / 1000;}protected override void OnException(ExceptionContext filterContext){ShopUtils.WriteLogFile(filterContext.Exception);if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content error };elsefilterContext.Result new ViewResult() { ViewName Error };}/// summary/// 获得路由中的值/// /summary/// param namekey键/param/// param namedefaultValue默认值/param/// returns/returnsprotected string GetRouteString(string key, string defaultValue){object value RouteData.Values[key];if (value ! null)return value.ToString();elsereturn defaultValue;}/// summary/// 获得路由中的值/// /summary/// param namekey键/param/// returns/returnsprotected string GetRouteString(string key){return GetRouteString(key, );}/// summary/// 获得路由中的值/// /summary/// param namekey键/param/// param namedefaultValue默认值/param/// returns/returnsprotected int GetRouteInt(string key, int defaultValue){return TypeHelper.ObjectToInt(RouteData.Values[key], defaultValue);}/// summary/// 获得路由中的值/// /summary/// param namekey键/param/// returns/returnsprotected int GetRouteInt(string key){return GetRouteInt(key, 0);}/// summary/// 提示信息视图/// /summary/// param namemessage提示信息/param/// returns/returnsprotected ViewResult PromptView(string message){return View(Prompt, new PromptModel(message));}/// summary/// 提示信息视图/// /summary/// param namebackUrl返回地址/param/// param namemessage提示信息/param/// returns/returnsprotected ViewResult PromptView(string backUrl, string message){return View(Prompt, new PromptModel(backUrl, message));}/// summary/// 获得验证错误列表/// /summary/// returns/returnsprotected string GetVerifyErrorList(){if (ModelState.Count 0)return null;StringBuilder errorList new StringBuilder([);foreach (KeyValuePairstring, ModelState item in ModelState){errorList.AppendFormat({0}key:{1},msg:{2}{3},, {, item.Key, item.Value.Errors[0].ErrorMessage, });}errorList.Remove(errorList.Length - 1, 1);errorList.Append(]);return errorList.ToString();}} } View Code using System; using System.Web; using System.Web.Mvc; using System.Web.Routing;using BrnShop.Core; using BrnShop.Services;namespace BrnShop.Web.Framework {/// summary/// 商城后台基础控制器类/// /summarypublic class BaseAdminController : Controller{//工作上下午public AdminWorkContext WorkContext new AdminWorkContext();protected override void Initialize(RequestContext requestContext){base.Initialize(requestContext);WorkContext.IsHttpAjax WebHelper.IsAjax();WorkContext.IP WebHelper.GetIP();WorkContext.Region Regions.GetRegionByIP(WorkContext.IP);WorkContext.Url WebHelper.GetUrl();WorkContext.UrlReferrer WebHelper.GetUrlReferrer();//获得用户唯一标示符sidWorkContext.Sid ShopUtils.GetSidCookie();if (WorkContext.Sid.Length 0){//生成sidWorkContext.Sid Sessions.GenerateSid();//将sid保存到cookie中ShopUtils.SetSidCookie(WorkContext.Sid);}PartUserInfo partUserInfo;//获得用户idint uid ShopUtils.GetUidCookie();if (uid 1)//当用户为游客时{//创建游客partUserInfo Users.CreatePartGuest();}else//当用户为会员时{//获得保存在cookie中的密码string password ShopUtils.GetPasswordCookie();//防止用户密码被篡改为危险字符if (password.Length 0 || !SecureHelper.IsBase64String(password)){//创建游客partUserInfo Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie();}else{partUserInfo Users.GetPartUserByUidAndPwd(uid, password);if (partUserInfo ! null){//发放登陆积分Credits.SendLoginCredits(ref partUserInfo, DateTime.Now);}else//当会员的账号或密码不正确时将用户置为游客{partUserInfo Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie();}}}//设置用户等级if (UserRanks.IsBanUserRank(partUserInfo.UserRid) partUserInfo.LiftBanTime DateTime.Now){UserRankInfo userRankInfo UserRanks.GetUserRankByCredits(partUserInfo.PayCredits);Users.UpdateUserRankByUid(partUserInfo.Uid, userRankInfo.UserRid);partUserInfo.UserRid userRankInfo.UserRid;}WorkContext.PartUserInfo partUserInfo;WorkContext.Uid partUserInfo.Uid;WorkContext.UserName partUserInfo.UserName;WorkContext.UserEmail partUserInfo.Email;WorkContext.UserMobile partUserInfo.Mobile;WorkContext.Password partUserInfo.Password;WorkContext.NickName partUserInfo.NickName;WorkContext.Avatar partUserInfo.Avatar;WorkContext.UserRid partUserInfo.UserRid;WorkContext.UserRank UserRanks.GetUserRankById(partUserInfo.UserRid);WorkContext.UserRTitle WorkContext.UserRank.Title;//设置用户管理员组WorkContext.AdminGid partUserInfo.AdminGid;WorkContext.AdminGroup AdminGroups.GetAdminGroupById(partUserInfo.AdminGid);WorkContext.AdminGTitle WorkContext.AdminGroup.Title;//设置当前控制器类名WorkContext.Controller RouteData.Values[controller].ToString().ToLower();//设置当前动作方法名WorkContext.Action RouteData.Values[action].ToString().ToLower();WorkContext.PageKey string.Format(/{0}/{1}, WorkContext.Controller, WorkContext.Action);}protected override void OnAuthorization(AuthorizationContext filterContext){//不能应用在子方法上if (filterContext.IsChildAction)return;//当用户ip不在允许的后台访问ip列表时if (!string.IsNullOrEmpty(WorkContext.ShopConfig.AdminAllowAccessIP) !ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.AdminAllowAccessIP)){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content 404 };elsefilterContext.Result new RedirectResult(/);return;}//当用户IP被禁止时if (BannedIPs.CheckIP(WorkContext.IP)){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content 404 };elsefilterContext.Result new RedirectResult(/);return;}//当用户等级是禁止访问等级时if (WorkContext.UserRid 1){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content 404 };elsefilterContext.Result new RedirectResult(/);return;}//如果当前用户没有登录if (WorkContext.Uid 1){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content 404 };elsefilterContext.Result new RedirectResult(/);return;}//如果当前用户不是管理员if (WorkContext.AdminGid 1){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content 404 };elsefilterContext.Result new RedirectResult(/);return;}//判断当前用户是否有访问当前页面的权限if (WorkContext.Controller ! home !AdminGroups.CheckAuthority(WorkContext.AdminGid, WorkContext.Controller, WorkContext.PageKey)){if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content notpermit };elsefilterContext.Result PromptView(你没有当前操作的权限);return;}}protected override void OnActionExecuting(ActionExecutingContext filterContext){//不能应用在子方法上if (filterContext.IsChildAction)return;//当用户为会员时,更新用户的在线时间if (WorkContext.Uid 0)Users.UpdateUserOnlineTime(WorkContext.Uid);//更新在线用户Asyn.UpdateOnlineUser(WorkContext.Uid, WorkContext.Sid, WorkContext.IP, WorkContext.Region.RegionId);//更新PV统计if (WorkContext.ShopConfig.UpdatePVStatTimespan ! 0)Asyn.UpdatePVStat(WorkContext.Uid, WorkContext.Region.RegionId, WebHelper.GetBrowserType(), WebHelper.GetOSType());}protected override void OnException(ExceptionContext filterContext){ShopUtils.WriteLogFile(filterContext.Exception);if (WorkContext.IsHttpAjax)filterContext.Result new ContentResult { Content error };elsefilterContext.Result new ViewResult() { ViewName Error };}/// summary/// 提示信息视图/// /summary/// param namemessage提示信息/param/// returns/returnsprotected ViewResult PromptView(string message){return View(Prompt, new PromptModel(ShopUtils.GetAdminRefererCookie(), message));}/// summary/// 提示信息视图/// /summary/// param namebackUrl返回地址/param/// param namemessage提示信息/param/// returns/returnsprotected ViewResult PromptView(string backUrl, string message){return View(Prompt, new PromptModel(backUrl, message));}/// summary/// 提示信息视图/// /summary/// param namebackUrl返回地址/param/// param namemessage提示信息/param/// param nameisAutoBack是否自动返回/param/// returns/returnsprotected ViewResult PromptView(string backUrl, string message, bool isAutoBack){return View(Prompt, new PromptModel(backUrl, message) { IsAutoBack isAutoBack });}/// summary/// 添加后台操作日志/// /summary/// param nameoperation操作行为/paramprotected void AddAdminOperateLog(string operation){AddAdminOperateLog(operation, );}/// summary/// 添加后台操作日志/// /summary/// param nameoperation操作行为/param/// param namedescription操作描述/paramprotected void AddAdminOperateLog(string operation, string description){AdminOperateLogs.CreateAdminOperateLog(WorkContext.Uid, WorkContext.UserName, WorkContext.AdminGid, WorkContext.AdminGTitle, WorkContext.IP, operation, description);}} } View Code   到此事情还没完那就是这个上下文是控制器的字段在视图中如果想访问它需要强制类型转换下代码为((BaseWebController)(this.ViewContext.Controller)).WorkContext;试想一下我们每次访问上下文都需要这么长的一段代码那是怎样的煎熬呀不过幸好有解决办法那就是重写mvc的WebViewPage页(如果你不知道WebViewPage和mvc的编译过程请阅读大神“Artech”的相关文章地址如下http://www.cnblogs.com/artech/)。具体代码在BrnShop.Web.Framework项目中WebViewPage类和AdminViewPage类其中WebViewPage为前台视图类AdminViewPage为后台视图类 using System; using System.Text; using System.Web.Mvc; using System.Collections.Generic;namespace BrnShop.Web.Framework {/// summary/// 前台视图页面基类型/// /summarypublic abstract class WebViewPageTModel : System.Web.Mvc.WebViewPageTModel{public WebWorkContext WorkContext;public override void InitHelpers(){base.InitHelpers();WorkContext ((BaseWebController)(this.ViewContext.Controller)).WorkContext;}/// summary/// 获得验证错误列表/// /summary/// returns/returnspublic MvcHtmlString GetVerifyErrorList(){ModelStateDictionary modelState ((Controller)(this.ViewContext.Controller)).ModelState;if (modelState null || modelState.Count 0)return new MvcHtmlString(null);StringBuilder errorList new StringBuilder([);foreach (KeyValuePairstring, ModelState item in modelState){errorList.AppendFormat({0}key:{1},msg:{2}{3},, {, item.Key, item.Value.Errors[0].ErrorMessage, });}errorList.Remove(errorList.Length - 1, 1);errorList.Append(]);return new MvcHtmlString(errorList.ToString());}}/// summary/// 前台视图页面基类型/// /summarypublic abstract class WebViewPage : WebViewPagedynamic{} } View Code using System;namespace BrnShop.Web.Framework {/// summary/// 后台视图页面基类型/// /summarypublic abstract class AdminViewPageTModel : System.Web.Mvc.WebViewPageTModel{public AdminWorkContext WorkContext;public override void InitHelpers(){base.InitHelpers();Html.EnableClientValidation(true);//启用客户端验证Html.EnableUnobtrusiveJavaScript(true);//启用非侵入式脚本WorkContext ((BaseAdminController)(this.ViewContext.Controller)).WorkContext;}}/// summary/// 后台视图页面基类型/// /summarypublic abstract class AdminViewPage : AdminViewPagedynamic{} } View Code    定义好新的视图类后我们需要通知编译器使用这个新类通知方式在视图文件的web.config中具体见下图   通过将pageBaseType的值设置为我们的新类名我们就可以在视图文件中直接使用上下文了。例WorkContext.ShopConfig.SEOKeyword   说完了数据的复用和传递我们再来说说大mvc框架和小mvc框架的问题。首先何为大mvc框架何为小mvc框架 大mvc框架指的是尽量完整的一套asp.net mvc框架包含路由控制器模型绑定模型校验筛选器等等。小mvc框架指的是只包含项目所必须使用的mvc部分对于使用不到的部分尽量不用或移除。  大家可能觉得这有什么难的但是对于一个开源项目来说这确实是一个很重要的问题因为开源项目的产品面向的是全国甚至是全世界的开发者大家的技术参差不齐有的高有个低。为了保证尽可能多的覆盖开发者只有原汁原味的mvc才对开发者更亲切和熟悉所以应该使用大mvc框架。可是一款优秀的产品不只是面向初级开发者还需要面对高级开发者对于高级开发者来说他们希望获得项目最大的可控权所以框架应该尽量只使用最核心的mvc部分这样留给开发者的空间才能更大这样这样看来又应该使用小mvc框架。下面我从两个方面来说明我们是如何解决这个问题的。   首先是mvc筛选器看过我们源码的园友已经发现我们项目中没有定义任何一个筛选器类。那我们的筛选器在哪儿答案就在上面的上下文流动中在上面重写的筛选器方法中我们实现所有筛选。如果你想针对某个控制器A单独筛选你可以在A中再一次重写筛选器方法添加自己的代码。如果你想只针对某一方法进行筛选你只需要单独在方法中筛选就可以了。这样通过使用内置在controller中的筛选方法我们实现了和第三方筛选器的隔离也减少了反射获取筛选器的次数。   其次是模型绑定和校验我们首先通过手动获取request集合的方式去除所有模型绑定以登陆代码为例 /// summary/// 登录/// /summarypublic ActionResult Login()//注意此方面没有任何参数{string returnUrl WebHelper.GetQueryString(returnUrl);if (returnUrl.Length 0)returnUrl /;if (WorkContext.ShopConfig.LoginType )return PromptView(returnUrl, 商城目前已经关闭登陆功能!);if (WorkContext.Uid 0)return PromptView(returnUrl, 您已经登录无须重复登录!);if (WorkContext.ShopConfig.LoginFailTimes ! 0 LoginFailLogs.GetLoginFailTimesByIp(WorkContext.IP) WorkContext.ShopConfig.LoginFailTimes)return PromptView(returnUrl, 您已经输入错误 WorkContext.ShopConfig.LoginFailTimes 次密码请15分钟后再登陆!);//get请求if (WebHelper.IsGet()){ViewData.Add(oAuthPluginList, Plugins.GetOAuthPluginList());return View(new LoginModel());}//post请求LoginModel model new LoginModel();//模型绑定 手动绑定model.AccountName WebHelper.GetFormString(WorkContext.ShopConfig.ShadowName).Trim();model.Password WebHelper.GetFormString(password);model.IsRemember WebHelper.GetFormInt(isRemember);model.VerifyCode WebHelper.GetFormString(verifyCode);//模型验证PartUserInfo partUserInfo VerifyLogin(model);if (!ModelState.IsValid)//验证失败时{ViewData.Add(oAuthPluginList, Plugins.GetOAuthPluginList());return View(model);}else//验证成功时{//当用户等级是禁止访问等级时if (partUserInfo.UserRid 1)return PromptView(您的账号当前被锁定,不能访问);//删除登陆失败日志LoginFailLogs.DeleteLoginFailLogByIP(WorkContext.IP);//更新用户最后访问int regionId WorkContext.Region ! null ? WorkContext.Region.RegionId : -1;Users.UpdateUserLastVisit(partUserInfo.Uid, WorkContext.IP, regionId, DateTime.Now);//更新购物车中用户idOrders.UpdateShopCartUidBySid(partUserInfo.Uid, WorkContext.Sid);//将用户信息写入cookie中ShopUtils.SetUserCookie(partUserInfo, (WorkContext.ShopConfig.IsRemember 1 model.IsRemember 1) ? 30 : -1);return Redirect(returnUrl);}} 其次是模型校验校验又分为两部分。第一部分是验证对此我们也是采用手动校验的方式同样以登陆为例 /// summary/// 登录验证/// /summaryprivate PartUserInfo VerifyLogin(LoginModel model){PartUserInfo partUserInfo null;//验证账户名if (string.IsNullOrWhiteSpace(model.AccountName)){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 账户名不能为空);}else if (model.AccountName.Length 4 || model.AccountName.Length 50){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 账户名必须大于3且不大于50个字符);}else if ((!SecureHelper.IsSafeSqlString(model.AccountName))){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 账户名不存在);}//验证密码if (string.IsNullOrWhiteSpace(model.Password)){ModelState.AddModelError(password, 密码不能为空);}else if (model.Password.Length 4 || model.Password.Length 32){ModelState.AddModelError(password, 密码必须大于3且不大于32个字符);}//验证验证码if (CommonHelper.IsInArray(WorkContext.PageKey, WorkContext.ShopConfig.VerifyPages)){if (string.IsNullOrWhiteSpace(model.VerifyCode)){ModelState.AddModelError(verifyCode, 验证码不能为空);}else if (model.VerifyCode.ToLower() ! Sessions.GetValueString(WorkContext.Sid, verifyCode)){ModelState.AddModelError(verifyCode, 验证码不正确);}}//当以上验证全部通过时if (ModelState.IsValid){if (BSPConfig.ShopConfig.LoginType.Contains(2) ValidateHelper.IsEmail(model.AccountName))//邮箱登陆{partUserInfo Users.GetPartUserByEmail(model.AccountName);if (partUserInfo null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 邮箱不存在);}else if (BSPConfig.ShopConfig.LoginType.Contains(3) ValidateHelper.IsMobile(model.AccountName))//手机登陆{partUserInfo Users.GetPartUserByMobile(model.AccountName);if (partUserInfo null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 手机不存在);}else if (BSPConfig.ShopConfig.LoginType.Contains(1))//用户名登陆{partUserInfo Users.GetPartUserByName(model.AccountName);if (partUserInfo null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, 用户名不存在);}//判断密码是否正确if (partUserInfo ! null Users.CreateUserPassword(model.Password, partUserInfo.Salt) ! partUserInfo.Password){LoginFailLogs.AddLoginFailTimes(WorkContext.IP, DateTime.Now);//增加登陆失败次数ModelState.AddModelError(password, 密码不正确);}}return partUserInfo;} 通过上面代码大家可以看出所有的验证都是手动进行的。   校验的第二部分是验证信息显示在mvc中大家经常使用Html.ValidationMessageFor之类的方法来显示验证信息所以为了保证上述方法还能够正常使用我们需要将所有验证信息都添加到ModelState中因为Html.ValidationMessageFor之类的方法实现本质就是通过获取ModelState指定键值的内容来判断是否显示和显示什么内容。到此我们已经有了校验数据剩下的就是在视图中显示了。关于显示我们仍然可以使用Html.ValidationMessageFor之类的方法如果你想获得更大的灵活性你可以使用视图页面的“GetVerifyErrorList”方法此方法在我们新定义的视图基类中它的功能就是将校验信息构建成一个json对象。代码如下 /// summary/// 获得验证错误列表/// /summary/// returns/returnspublic MvcHtmlString GetVerifyErrorList(){ModelStateDictionary modelState ((Controller)(this.ViewContext.Controller)).ModelState;if (modelState null || modelState.Count 0)return new MvcHtmlString(null);StringBuilder errorList new StringBuilder([);foreach (KeyValuePairstring, ModelState item in modelState){errorList.AppendFormat({0}key:{1},msg:{2}{3},, {, item.Key, item.Value.Errors[0].ErrorMessage, });}errorList.Remove(errorList.Length - 1, 1);errorList.Append(]);return new MvcHtmlString(errorList.ToString());} 下面给出一个使用例子代码是登陆视图的代码 //脚本代码 script typetext/javascriptvar verifyErrorList GetVerifyErrorList();$(function(){if (verifyErrorList ! null) {for(var i 0; i verifyErrorList.length; i){$(#verifyErrorList[i].keyError).html(verifyErrorList[i].msg)}}})/script//html代码trtd密码/tdtdinput typepassword namepassword idpassword valueModel.Password//tdtdspan stylecolor: Red; idpasswordError/span/td/tr   通过以上实现我们既保证框架能够兼容mvc各个功能又为高级开发者提供了足够的扩展空间。PS团队中有位同事曾经将asp.net mvc源码中有关模型绑定和模型校验的代码全部删除并完美运行实例性能和开销都少了不少有兴趣的朋友可以去试试   如果想下载商城源码可以点此下载。有对网上商城程序设计感兴趣的朋友欢迎加入QQ群235274151大家可以交流下 posted on 2014-06-26 17:51 NET未来之路 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/lonelyxmas/p/3810565.html
http://www.pierceye.com/news/73898/

相关文章:

  • 网站优化效果怎么样wordpress打赏赞插件
  • 关于国家对网站建设青海城乡建设部网站首页
  • 派设计包装设计网站地方网站做相亲赢利点在哪
  • 重庆公司核名在哪个网站互联网推广开户
  • 长沙建站公司dnf免做卡怎么领取网站
  • 站长网站seo查询电商推广渠道有哪些
  • 电子商务网站平台建设前景展望微信怎么弄小程序卖东西
  • 广安市邻水建设局网站上海网站关键词优化
  • 网站开发公司招聘企业展厅设计公司的资质是什么
  • 盘锦微商网站建设重庆网站公司制作价格
  • 行业网站排名计算机网络技术毕业设计
  • 郑州十大网站建设公司怎样用代码制作网站
  • 多用户自助建站系统源码在原域名给公司建立网站
  • 备案通过后 添加网站国外对旅游网站建设的现状
  • 自己做发卡网站支付接口网站开发基础课程
  • 慢慢来建站公司wordpress时间文件夹
  • vps服务器的iis网站wordpress 本地 上传到服务器
  • 网站建设的项目方案模板wordpress论坛怎么用
  • 电商网站开发prd网站广告的优势
  • 网站开发移动app微网站 布局
  • 网站开发工程师面试问题网站制作方案报价
  • 网络推广站wordpress 注册 邮箱
  • 营销型网站托管推荐几个免费的网站
  • 广州网站建设年底促销做电影网站收入
  • 国内永久免费saas crm郑州网站优化工资
  • 设计网站设计网站WordPress娱乐网模板源码
  • 北京网站设计制作招聘网网站反链接什么
  • 哪个博客可以做单页网站湘潭网站建设优化建站
  • 建设网站企业空间破解网站
  • flask做的网站项目WordPress启用插件