Tôi đã thiết lập bộ lọc toàn cục cho tất cả các hành động điều khiển của mình, trong đó tôi mở và đóng các phiên NHibernate. 95% của các hành động này cần một số truy cập cơ sở dữ liệu, nhưng 5% không. Có cách nào dễ dàng để vô hiệu hóa bộ lọc toàn cầu này cho 5% đó không. Tôi có thể đi theo một cách khác và chỉ trang trí những hành động cần cơ sở dữ liệu, nhưng điều đó sẽ hoạt động hiệu quả hơn nhiều.Làm thế nào để vô hiệu hóa một bộ lọc toàn cầu trong ASP.Net MVC chọn lọc
Trả lời
Bạn có thể viết một thuộc tính marker:
public class SkipMyGlobalActionFilterAttribute : Attribute
{
}
và sau đó trong bài kiểm tra bộ lọc hành động toàn cầu của bạn cho sự hiện diện của dấu này vào hành động:
public class MyGlobalActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(SkipMyGlobalActionFilterAttribute), false).Any())
{
return;
}
// here do whatever you were intending to do
}
}
và sau đó nếu bạn muốn loại trừ một số hành động từ bộ lọc chung chỉ cần trang trí nó với thuộc tính điểm đánh dấu:
[SkipMyGlobalActionFilter]
public ActionResult Index()
{
return View();
}
Bạn có thể thay đổi mã bộ lọc của bạn như thế này:
public class NHibernateActionFilter : ActionFilterAttribute
{
public IEnumerable<string> ActionsToSkip { get; set; }
public NHibernateActionFilter(params string[] actionsToSkip)
{
ActionsToSkip = actionsToSkip;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (null != ActionsToSkip && ActionsToSkip.Any(a =>
String.Compare(a, filterContext.ActionDescriptor.ActionName, true) == 0))
{
return;
}
//here you code
}
}
Và sử dụng nó:
[NHibernateActionFilter(new[] { "SkipFilterAction1 ", "Action2"})]
Đó là một cách để thực hiện, nhưng hơi khó duy trì theo thời gian – zszep
Nếu bạn thay đổi tên hành động của bạn và quên thay đổi nó trong cách sử dụng thuộc tính, trình biên dịch sẽ không cảnh báo bạn.Điều này là rất có khả năng gây ra đau đớn bảo trì.Tôi thích câu trả lời của Darin kể từ khi bạn không cần phải xác định các hành động bằng tay – Nashenas
Bạn cũng có thể làm gì được mô tả trong bài viết này awesome:
Chỉ cần thực hiện tùy chỉnh ExcludeFilterAttribute
và sau đó tùy chỉnh ExcludeFilterProvider
.
Giải pháp làm sạch và làm việc tuyệt vời cho tôi!
Bất kỳ giải pháp tương tự cho lõi aspnet? – smg
Câu trả lời tốt nhất cho điều này được cung cấp trên một câu hỏi khác:
Tạo một nhà cung cấp tùy chỉnh Filter. Viết một lớp sẽ thực hiện IFilterProvider. Giao diện IFilterProvider này có phương thức GetFilters trả về các bộ lọc cần được thực hiện.
public class MyFilterProvider : IFilterProvider
{
private readonly List<Func<ControllerContext, object>> filterconditions = new List<Func<ControllerContext, object>>();
public void Add(Func<ControllerContext, object> mycondition)
{
filterconditions.Add(mycondition);
}
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
return from filtercondition in filterconditions
select filtercondition(controllerContext) into ctrlContext
where ctrlContext!= null
select new Filter(ctrlContext, FilterScope.Global);
}
}
======================= ==================================
Trong Global.asax.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
MyFilterProvider provider = new MyFilterProvider();
provider.Add(d => d.RouteData.Values["action"].ToString() != "SkipFilterAction1 " ? new NHibernateActionFilter() : null);
FilterProviders.Providers.Add(provider);
}
protected void Application_Start()
{
RegisterGlobalFilters(GlobalFilters.Filters);
}
Vâng , Tôi nghĩ rằng tôi đã nhận nó làm việc cho ASP.NET Core.
Dưới đây là các mã:
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// Prepare the audit
_parameters = context.ActionArguments;
await next();
if (IsExcluded(context))
{
return;
}
var routeData = context.RouteData;
var controllerName = (string)routeData.Values["controller"];
var actionName = (string)routeData.Values["action"];
// Log action data
var auditEntry = new AuditEntry
{
ActionName = actionName,
EntityType = controllerName,
EntityID = GetEntityId(),
PerformedAt = DateTime.Now,
PersonID = context.HttpContext.Session.GetCurrentUser()?.PersonId.ToString()
};
_auditHandler.DbContext.Audits.Add(auditEntry);
await _auditHandler.DbContext.SaveChangesAsync();
}
private bool IsExcluded(ActionContext context)
{
var controllerActionDescriptor = (Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;
return controllerActionDescriptor.ControllerTypeInfo.IsDefined(typeof(ExcludeFromAuditing), false) ||
controllerActionDescriptor.MethodInfo.IsDefined(typeof(ExcludeFromAuditing), false);
}
Mã liên quan là trong phương pháp 'IsExcluded'.
Ít nhất hiện nay, điều này khá dễ dàng: để loại trừ tất cả các bộ lọc hành động khỏi một hành động, chỉ cần thêm Ghi đè hành độngFiltersAttribute.
Có thuộc tính tương tự cho các bộ lọc khác: OverrideAuthenticationAttribute, OverrideAuthorizationAttribute và OverrideExceptionAttribute.
Xem thêm https://www.strathweb.com/2013/06/overriding-filters-in-asp-net-web-api-vnext/
- 1. Làm thế nào để thêm toàn cầu ASP.Net Web Api bộ lọc?
- 2. Làm thế nào để "vô hiệu hóa" các phần của bộ đệm đầu ra ASP.NET MVC?
- 3. asp.net mvc 3 handleerror bộ lọc toàn cầu luôn hiển thị trạng thái IIS 500 trang
- 4. Có cách nào thông minh hơn để vô hiệu hóa bộ lọc Doctrine2 trong Symfony2.1 không?
- 5. ASP.Net: Làm thế nào để vô hiệu hoá một ListItem?
- 6. asp.net mvc vô hiệu hóa bộ nhớ cache ajax
- 7. Magento lưới vô hiệu hóa phân loại và lọc
- 8. API Web: Bộ lọc 'Toàn cầu' không hoạt động (ExceptionFilter)
- 9. làm thế nào để vô hiệu hóa toàn bộ cơ thể khác với một div
- 10. Chọn lọc vô hiệu hóa các trình vòng lặp đã kiểm tra
- 11. ASP.net MVC lọc Authorize toàn cầu buộc đăng nhập vào một hành động AllowAnonymous
- 12. làm thế nào để vô hiệu hóa toàn bộ điều khiển thả xuống trong html
- 13. Bộ lọc thuộc tính toàn cầu ở Jackson
- 14. HTTP module vs bộ lọc hành động trong asp.net-mvc
- 15. Làm thế nào để vô hiệu hóa bộ nhớ cache của trình duyệt trong asp.net mvc 3?
- 16. Làm thế nào để vô hiệu hóa bộ đệm sâu?
- 17. Ghi đè bộ lọc hành động toàn cầu
- 18. Làm thế nào để vô hiệu hóa bộ nhớ cache "Đọc" Yêu cầu trong Nguồn dữ liệu UI Kendo
- 19. ASP.Net MVC Authorization lọc hành động
- 20. MVC 4 Bộ lọc ngoại lệ toàn cầu cách triển khai?
- 21. Một cách để loại trừ bộ lọc hành động trong ASP.NET MVC?
- 22. Làm thế nào để vô hiệu hóa xác thực mô hình MVC 4?
- 23. Bộ lọc hình cầu trong android
- 24. Làm cách nào để vô hiệu hóa các yêu cầu của máy khách ASP.NET Web Service?
- 25. Cách xóa bộ lọc trên Telerik ASP.NET MVC Grid
- 26. Làm thế nào để vô hiệu hóa các điều khiển trong một trang ASP.NET khi usercontrol được chọn?
- 27. Lọc một tập trong Clojure clojure.set/chọn vs clojure.core/lọc
- 28. C# Làm thế nào để vô hiệu hóa một phím
- 29. Làm thế nào để vô hiệu hóa khả năng chọn trong một DataGridView?
- 30. Làm thế nào để vô hiệu hóa lựa chọn một mục duy nhất trong GridView
Điều gì về việc tạo một hành động khác và trang trí 5% với điều này. Một cái gì đó như NHibernateNotRequiredAttribute()? – dreza
https://weblogs.asp.net/imranbaloch/new-filter-overrides-in-asp-net-mvc-5-and-asp-net-web-api-2 – dovid