VS - ActionFilterAttribute
Global.asax.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class MvcApplication : System.Web.HttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); //AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; EPSEmailInfoBLL.RefreshEmailSettings(); UnityHelper.UnityContainer.LoadConfiguration(); WebHelper.WebHelperImpl = UnityHelper.Resolve<IWebHelper>(); } } |
FilterConfig.cs
1 2 3 4 5 6 7 8 | public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add( new HandleErrorAttribute()); filters.Add( new LogAction() { }); } } |
LogAction.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false , Inherited = true )] public sealed class LogAction : ActionFilterAttribute { private string actionName = string .Empty; private Stopwatch sw = null ; public override void OnActionExecuting(ActionExecutingContext filterContext) { sw = Stopwatch.StartNew(); actionName = filterContext.ActionDescriptor.ActionName; string function = actionName + " Start..." ; if (filterContext.ActionParameters.Count == 0) { LogFormatHelper.LogRequestParams(function); } else { object [] objs = new object [filterContext.ActionParameters.Count]; int i = 0; foreach ( var dic in filterContext.ActionParameters){ objs[i++] = dic.Value; } LogFormatHelper.LogRequestParams(function, objs); } base .OnActionExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { base .OnResultExecuted(filterContext); string function = actionName + " End" ; StringBuilder sb = new StringBuilder(); foreach ( var key in filterContext.RouteData.Values.Keys) { sb.AppendFormat( "{0} = {1}" , key, filterContext.RouteData.Values[key]).AppendLine(); } string str = filterContext.RouteData.Values.ToString(); LogFormatHelper.LogRequestParams(function, sw.Elapsed , sb.ToString() ); if (filterContext.Exception != null ) { LogFormatHelper.LogServiceError(filterContext.Exception, actionName); } } } |
CheckLoginAttribute.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false , Inherited = true )] public sealed class CheckLogin : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Session != null ) { if (filterContext.HttpContext.Session.IsNewSession) { //LogFormatHelper.LogRequestParams("filterContext.HttpContext.Session.IsNewSession"); filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary( new { Controller = "Account" , Action = "Login" })); } } } } |
AccountController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | [RequireHttps] #endif [Authorize] [InitializeSimpleMembership] [LogAction] public class AccountController : Controller { public AccountController() : this ( new FormsAuthenticationService(), new UserAuthenticator()) { //this.FormsAuth = new FormsAuthenticationService(); } } |
NoResubmitAttribute.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | [AttributeUsage(AttributeTargets.All, AllowMultiple = false )] public class NoResubmitAttribute : ActionFilterAttribute { private static readonly string HttpMehotdPost = "POST" ; private static readonly string prefix = "postFlag" ; private string nameWithRoute; public override void OnActionExecuting(ActionExecutingContext filterContext) { var controllerContext = filterContext.Controller.ControllerContext; if (!controllerContext.IsChildAction) { var request = controllerContext.HttpContext.Request; var session = controllerContext.HttpContext.Session; nameWithRoute = generateNameWithRoute(controllerContext); int sessionFlag = session[nameWithRoute] == null ? 0 : ( int )session[nameWithRoute]; int requestFlag = string .IsNullOrEmpty(request.Form[nameWithRoute]) ? 0 : int .Parse(request.Form[nameWithRoute]); // get or normal post: true; bool isValid = !IsPost(filterContext) || sessionFlag == requestFlag; if (sessionFlag == int .MaxValue) { sessionFlag = -1; } session[nameWithRoute] = ++sessionFlag; if (!isValid) { filterContext.Result = new RedirectResult(GenerateUrlWithTimeStamp(request.RawUrl)); return ; } } base .OnActionExecuting(filterContext); } /// <summary> /// Modify the url to avoid issue: /// When Redirect to itself in a F5 Refresh, the redirect doesn't work in client browser sometimes. /// </summary> /// <param name="url"></param> /// <returns></returns> private string GenerateUrlWithTimeStamp( string url) { return string .Format( "{0}{1}timeStamp={2}" , url, url.Contains( "?" ) ? "&" : "?" , (DateTime.Now - DateTime.Parse( "2010/01/01" )).Ticks); } private bool IsPost(ActionExecutingContext filterContext) { return filterContext.HttpContext.Request.HttpMethod == HttpMehotdPost; } private string generateNameWithRoute(ControllerContext controllerContext) { StringBuilder sb = new StringBuilder(prefix); foreach ( object routeValue in controllerContext.RouteData.Values.Values) { sb.AppendFormat( "_{0}" , routeValue); } return sb.ToString(); } public override void OnResultExecuted(ResultExecutedContext filterContext) { base .OnResultExecuted(filterContext); if (!filterContext.IsChildAction && !(filterContext.Result is RedirectResult)) { //string format = "<script type='text/javascript'>$(function () [[ $('form').each(function()[[$('<input type=hidden id={0} name={0} value={1} />').appendTo($(this));]])]]); </script>"; string format = "<script type='text/javascript'> var forms = document.getElementsByTagName('form'); for(var i = 0; i<forms.length; i++)[[var ele = document.createElement('input'); ele.type='hidden'; ele.id=ele.name='{0}'; ele.value='{1}'; forms[i].appendChild(ele);]] </script>" ; string script = string .Format(format, nameWithRoute, filterContext.HttpContext.Session[nameWithRoute]).Replace( "[[" , "{" ).Replace( "]]" , "}" ); filterContext.HttpContext.Response.Write(script); } } } |
[ValidateAntiForgeryToken]
EmailAttribute.cs
1 2 3 4 5 6 7 8 | public class EmailAttribute : RegularExpressionAttribute { public EmailAttribute() : base ( "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?" ) { ErrorMessage = "The field {0} is an invalid email address." ; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!