2012-01-09 20 views
15

私はnopCommerceで作業していますが、唯一のアクションフィルターを追加する必要があります。ただし、コードを上書きしないようにコアコントローラーを変更する必要はありません。新しい更新がリリースされます。ASP.NET MVC:コントローラーを変更せずにアクションフィルターを登録する

私はセットアップ私のアクションフィルタました:私は、コントローラを変更した場合

public class ProductActionFilterAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Result is ViewResult) 
     { 
      ... 
     } 
     base.OnActionExecuted(filterContext); 
    } 

} 

を、私はちょうど私がそれをに割り当てるアクションに[ProductActionFilter]を追加することができます。

コントローラーを変更せずにカスタムアクションフィルターを特定のアクションに登録する方法はありますか?

答えて

22

私はグローバルフィルタが必要なものだと思います。あなたは、フィルタを作成したら

は、Global.asaxの中でそれを登録:あなたはすべてのアクションにはない、それを適用したい場合は

protected void Application_Start() { 

    AreaRegistration.RegisterAllAreas(); 

    // Register global filter 
    GlobalFilters.Filters.Add(new MyActionFilterAttribute()); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

をフィルタリングするために、カスタム検証ロジックを追加します。

+0

感謝。グローバルフィルタは適切なオプションのように見え、あなたが言うように、特定のコントローラ/アクションをチェックすることができます。 'GlobalFilters.Filters.Add'を使うのではなく、そこに何かを投げ込むだけで、' FilterProviders.Providers.Add'は同じように動作しますか?私はそれがどのように動作するか100%確信していませんが、特定のコントローラー/アクションを指定することができます。 –

+0

@Scroobyはい、FilterProviderも機能する可能性があります。 http://stackoverflow.com/questions/5312624/filters-add-vs-filterproviders-providers-addを確認してください。 – sashaeve

2

MVC 3では、すべてのアクションに対してフィルタを登録したい場合は、Global action filtersを適用することができます。もちろん、これはnopCommerceがMVC 3上に構築されている必要があります。これは最新のバージョンだと思いますか?

0

部分クラスの作成はどうですか。

public partial class CatalogController : BaseNopController 

あなたがクラスにフィルタを配置し、アクション名を照会することができます:バージョン2.60の時点ではすべてのコントローラは、パーシャルあります。

1

NopCommerce 3.5(この回答の最新で質問日より新しい)では、グローバルアクションフィルタを追加するための最良の方法は、IStartupTask実装のプラグインを作成することです。この方法は、NopCommerceコアファイルの変更を完全に回避します。

NopCommerce Application_StartイベントはEngineContextを初期化し、NopEngineインスタンスを作成します。 NopEngineの初期化では、すべてのIStartupTaskの実装が検出され、指定された順序で実行されます。したがって、IStartupTaskは、アプリケーションの開始時に起こる必要のあることを行う場所です。以下

サンプルコード:あなたの応答のための

public class Plugin : BasePlugin 
{ 
    public Plugin() 
    { 
    } 

    /// <summary> 
    /// Check to see if this plugin is installed 
    /// </summary> 
    public static bool IsInstalled(ITypeFinder typeFinder) 
    { 
     IEnumerable<Type> types = typeFinder.FindClassesOfType<IPluginFinder>(true); 

     if (types.Count() == 1) 
     { 
      IPluginFinder plugins = Activator.CreateInstance(types.First()) as IPluginFinder; 
      PluginDescriptor descriptor = plugins.GetPluginDescriptorBySystemName("MyPluginName"); 

      if (descriptor != null && descriptor.Installed) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

/// <summary> 
/// Redirects to the 404 page if criteria not met 
/// </summary> 
public class FluffyTextureRequiredAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (Kitten.Texture != Textures.Fluffy) 
     { 
      var routeValues = new RouteValueDictionary(); 
      routeValues.Add("controller", "Common"); 
      routeValues.Add("action", "PageNotFound"); 

      filterContext.Result = new RedirectToRouteResult(routeValues); 
     } 
    } 
} 

/// <summary> 
/// Does application start event stuff for the plugin, e.g. registering 
/// global action filters 
/// </summary> 
public class StartupTask : IStartupTask 
{ 
    private ITypeFinder _typeFinder; 

    public StartupTask() 
    { 
     //IStartupTask objects are created via Activator.CreateInstance with a parameterless constructor call, so dependencies must be manually resolved. 
     _typeFinder = EngineContext.Current.Resolve<ITypeFinder>(); 
    } 

    public void Execute() 
    { 
     // only execute if plugin is installed 
     if (Plugin.IsInstalled(_typeFinder)) 
     { 
      // GlobalFilters is in System.Web.Mvc 
      GlobalFilters.Filters.Add(new FluffyTextureRequiredAttribute()); 
     } 
    } 

    public int Order 
    { 
     get { return int.MaxValue; } 
    } 
} 
関連する問題