4

ユーザーがログインしている場合にすべてのアクションに対して実行されるグローバルフィルターを作成しようとしています。読んだことから、必要な2つのステップがあります。最初に、Global.asx ファイル内に新しいフィルターを追加します。

public class MvcApplication : System.Web.HttpApplication
{
    //I added this
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new NotificationFilter());
    }
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }
}

次に、filters フォルダーにフィルター自体を作成する必要があります。

public class NotificationFilter : ActionFilterAttribute 
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    { //Breakpoint here is never triggered
        //This code doesn't work, but it's what I want to do
        if (WebSecurity.CurrentUserId > 0)
        {
            var notificationCount = db.Notifications.GroupBy(i => i.UserID).Count();
            if (notificationCount > 99)
            {
                ViewBag.Notifications = "99+";
            }
            else
            {
                ViewBag.Notifications = notificationCount;
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

どうすればこれを機能させることができますか?より良い方法はありますか?これをすべてのコントローラーに追加するとうまくいきますが、それは理想的とは言えません。

4

4 に答える 4

5

私も同じ経験をしました。BaseController クラスを構築し、そこにフィルター定義を入れることができます。次に、すべてのコントローラーを BaseController クラスから継承する必要があります。したがって、すべてのコントローラーでフィルター クラスを使用する必要はありません。

このようなもの:

    public class BaseController : Controller
    {

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
         ...
         }
    }

コントローラーで:

public class SampleController : BaseController
{
 ...
}
于 2013-01-26T20:01:17.743 に答える
2

問題にこのコードを使用できます:

public class ParentController : Controller
{

   protected override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       /* take current action*/
       action = (string)filterContext.RouteData.Values["action"];

       /* check if your action have your filter */
       if (!string.IsNullOrEmpty(action) && Methods.
                    Where(
                           method => method.Name == action
                           &&        method.GetCustomAttributes(typeof(/* your filter name */), true).Length > 0
                    ).Count() > 0)
          {
            // do your work    
          }


   }
}

public class YourController : ParentController 
{

  // implementation of your controller
}
于 2013-02-04T12:08:57.567 に答える
1

Jed、私が理解していることから、すべてのページが同じように動作し、認証されたユーザーに通知を表示する必要があります。

_layout 内で、左上の Div と jquery Ajax 呼び出しを配置することをお勧めします (後で jquery を alert.js ファイルにプッシュできます)。

    <div id='divNotifications'></div>

    <script type="text/javascript">
       $(document).ready(function() {
       $('#divNotifications').load('Notifications/UserNotifications');
       }
    </script>

あなたの Notifications Controller 内で UserNotifications メソッドが以下を返します:

public JsonResult AjaxUserNotifications()
{

    Notifications Notifications = new GetNotifications();

    return Json(Notifications, JsonRequestBehavior.AllowGet);
}

最初に、機能の証明としてこのレンダリングを 1 回行うことをお勧めします。次に、繰り返し呼び出すことをお勧めします。

ユーザーに常に通知せずにsetIntervalで新しいメッセージを常にチェックする方法は?

このスタック スレッドでは、時間間隔で Ajax 呼び出しを繰り返す方法について説明します。

于 2013-01-26T23:37:31.490 に答える