2009-10-13 4 views
4

Возможно ли в ASP.NET MVC через некоторые точки расширения/переопределения, чтобы позволить «поле делегата» использоваться как «действие»?ASP.NET MVC: Использует поле делегата как метод действия?

Что-то вроде:

using System; 
using System.Web.Mvc; 

namespace Company.Web.Controllers 
{ 
    public class SwitchboardController : BaseController 
    { 
     public Func<ActionResult> Index, Admin, Data, Reports; 

     public SwitchboardController() 
     { 
      // Generic views 
      Index = Admin = Data = Reports = 
       () => View(); 
     } 
    } 
} 

Я знаю, что я немного одержима для этого, но если это возможно, было бы открыть много новых способов сделать действия. Например, у вас могут быть общие представления Django в MVC с одной строкой кода для определения действия или разными способами учета дублирующей логики на нескольких контроллерах.

Я не уверен, где бы было место, чтобы пощекотать эту логику или сколько потребуется работы, чтобы изменить что-то настолько фундаментальное в рамках.

+1

это выглядит как удивительная идея! –

+0

Умный хакит! +1 –

ответ

1

Нет, это не так. Базовый контроллер ищет методы, а не поля для отправки действия.

EDIT:
К сожалению, я был немного быстро и фиксируются на стандартные классы услуг.
Вы можете это сделать, но вы должны перезаписать метод Execute в своем контроллере или реализовать и предоставить свой собственный IActionInvoker, чтобы отправить действие в поля. Посмотрите сообщение action processing in detail. В нем подробно описывается диспетчеризация.

+2

Возможно, это невозможно с контроллером по умолчанию, но есть некоторые хорошие точки расширения в ASP.NET MVC для подключения ваших собственных контроллеров и изменения способа работы. –

+0

Ваше право. Я отредактировал свой ответ. – Christian13467

3

Возможно, вам придется построить собственный завод Контроллера. Этот класс строит контроллеры и реализует IControllerFactory. Вы можете наследовать от DefaultControllerFactory. Переопределите CreateController(), чтобы вернуть свой собственный IController.

Зарегистрируйте свой контроллер завод в Application_Start() из MvcApplication, используя следующую строку:

ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory)); 

В вашей реализации IController, переопределить метод Execute. Вы можете использовать RequestContext, чтобы решить, какой делегат вызывать. Вероятно, было бы легче наследовать от ControllerBase и переопределить Execute там, если вы не хотите полностью реализовывать IController.

RequestContext, переданный в Execute, несет объект RouteData. Это словарь, заполненный механизмом маршрутизации, который сообщает вам, какое действие следует вызывать, и любые параметры. Вы можете получить имя действия, как это:

//context is a RequestContext object passed to IController.Execute() 
string actionName = requestContext.RouteData.Values["action"]; 

Вы можете даже определить свое действие в качестве словаря, а просто вытащить их, как только вы получите имя действия.

Последнее, что обычные методы действий возвращают ActionResult, который использует фреймворк для определения вида представления. После того, как вы выполните своих делегатов, я думаю, вам придется вручную установить некоторые вещи в своем специальном базовом контроллере. Я не совсем уверен, что установить или как заставить ваш просмотр выполнить здесь без взлома, чтобы открыть источник MVC.

Удачи вам! Это выглядит как интересная идея.

1

Как вы, кажется, используете в своем примере код BaseController, если вы переопределяете Execute (из IController), вы сможете интерпретировать действие request =>, как вам нравится.

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