2010-05-28 5 views
0

Я только начал новый проект в ASP.net 4.0 с MVC 2.Как добавить пользовательские крючки для контроллеров в ASP.NET MVC2

Что мне нужно, чтобы быть в состоянии сделать, это иметь собственный крючок начало и конец каждого действия контроллера.

например.

public void Index() { 
    *** call to the start custom hook to externalfile.cs (is empty so does nothing) 

    ViewData["welcomeMessage"] = "Hello World"; 

    *** call to the end custom hook to externalfile.cs (changes "Hello World!" to "Hi World") 

    return View(); 
} 

Просмотреть затем посмотреть welcomeMessage как «Привет мир» после изменения в пользовательском крюке.

Пользовательский крючок должен быть во внешнем файле и не изменять скомпилированный код ядра. Это вызывает проблему, так как с моими ограниченными знаниями ASP.NET MVC должен быть скомпилирован.

Есть ли у кого-нибудь советы о том, как это можно достичь?

Благодаря

ответ

3

Вы создаете свой собственный класс на основе ActionFilterAttribute. Он имеет следующие крючки.

  1. OnActionExecuted
  2. OnActionExecuting
  3. OnResultExecuted
  4. OnResultExecuting

Например,

public class MyFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var controller = filterContext.Controller; 

     controller.ViewData["welcomeMessage"] = "Hi World!"; 
     controller.TempData["Access_My_TempData"] = "Some Value"; 

     base.OnActionExecuted(filterContext); 
    } 
} 

Вы также можете проверить, какой тип [действий] метод действий является выполнение ,

if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult)) 
{ 
    // do something only if we are redirecting to a different action 
} 
else if (filterContext.Result is ViewResult) 
{ 
    // this is just a normal View action 
} 

О, я забыл показать, как использовать атрибут.
Вы просто украшаете поверх своего метода действий.

[MyFilterAttribute] 
public ActionResult MyActionMethod() 
{ 
    return View(); 
} 
+0

Если вы не хотите вручную ставить атрибут на каждое действие, я считаю, что вы можете создать общий тип базового контроллера и поместить атрибут на сам тип. – Ryan

+0

Это похоже на то, что я надеюсь сделать. Спасибо – Adrian

1

события на основе системы плагина, где вы можете динамически вызывать код сценария. Таким образом, создавая (например) скрипты с железом python, вызываемые при возникновении событиями контроллером.

Не обязательно быть железным питоном, но это будет иметь наибольший смысл, что я могу видеть.

+0

Я сделал схожую с этим, хотя и не в MVC. Хорошо работает. –

0

Как насчет переопределения OnActionExecuting/OnAction Выполнено и используется MEF (Импорт, Экспорт другого кода сборки)?

+0

Зачем использовать MEF, когда эта концепция уже находится в структуре MVC как ActionFilter? – Ryan

+0

Потому что он думал, что выполняется динамический код инъекции в фильтре действия. – takepara

Смежные вопросы