2014-09-12 3 views
2

Я использую фильтр actin в ASP.NET MVC, теперь, если есть только один метод действия, то я не выдавал, но когда есть 2 метода с таким же именем только протокол отличается от http get и post, то как я могу использовать фильтр?как использовать фильтр действий, когда у меня есть метод с одним и тем же именем с другим протоколом

Прошу совета!

метод действий: -

[httpget] 
public actionresult home() 
{ 
return view(); 
} 

[httppost] 
public actionresult home() 
{ 
return null; 
} 

Код Действие фильтра:

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
     { 
      if (actionDescriptor.ControllerDescriptor.ControllerType == typeof(HomeController) && 
         (actionDescriptor.ActionName.Equals("home"))) 
      { 
       return new Filter[] 
        { 
         new Filter(this._actionFilter, FilterScope.Action, null) 
        }; 
      } 

      return new Filter[] { }; 

     } 

public void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      try 
      { 
       filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary {{ "Controller", "xyz" }, 
             { "Action", "abc" } }); 

      } 
      catch (Exception ex) 
      { 

      } 
     } 

Смотрите, когда я запускаю этот код я нашел каждый раз, когда этот код работать на HttpGet, но я хочу, чтобы запустить фильтр HttpPost метод.

ответ

2

Попробуйте с этим в методе GetFilter:

if (actionDescriptor.ControllerDescriptor.ControllerType == typeof(HomeController) && 
        (actionDescriptor.ActionName.Equals("home")) && controllerContext.HttpContext.Request.HttpMethod == "POST") 
+0

Thankxx человек, это работает отлично ... – 2014-09-12 07:45:43

2

Вы можете проверить, если он имеет HttpPost атрибут или нет, значит HttPost вызывается клиентом или HttpoGet:

public void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    try 
    { 
    var actionName = filterContext.ActionDescriptor.ActionName; 
    var actionParams = filterContext.ActionDescriptor.GetParameters 
    var actionParamsTypes = actionParams.Cast<ParameterDescriptor>() 
             .Select(x => x.ParameterType).ToArray(); 
    var controllerType = filterContext.Controller.GetType();    
    var actionMethodInfo = controllerType.GetMethod(actionName, 
               actionParamsTypes, 
               null);    
    var IsHttpPost = actionMethodInfo.IsDefiend(typeof(HttpPostAttribute),false); 

    if(IsHttpPost) // checking if it is HttpPost 
    { 
     // do something 
    } 
    } 
    catch (Exception ex) 
    { 

    } 

}