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();
        }
    }
}

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

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

13.10.2009 06:39:32
это похоже на отличную идею!
Matt Kocaj 15.10.2009 09:26:59
Умные вещи чакрить! +1
Robert Koritnik 28.02.2011 22:27:57
3 ОТВЕТА

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

РЕДАКТИРОВАТЬ:
Извините, я был немного быстр и привязан к стандартным классам.
Вы можете сделать это, но вы должны перезаписать метод Execute в вашем контроллере или реализации и предоставить свой собственный IActionInvoker для отправки действия в поля. Посмотрите на обработку пост- действий в деталях . Это объясняет отправку в деталях.

1
13.10.2009 11:40:40
Возможно, это невозможно с контроллером по умолчанию, но в ASP.NET MVC есть несколько хороших точек расширения для подключения ваших собственных контроллеров и изменения способа работы.
Lance Fisher 13.10.2009 07:28:42

Вам, вероятно, придется построить собственную фабрику контроллеров. Этот класс создает контроллеры и реализует 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, который используется платформой, чтобы решить, какое представление визуализировать. После того, как вы выполните свои делегаты, я думаю, вам придется вручную устанавливать некоторые вещи в вашем специальном базовом контроллере. Я не совсем уверен, что установить или как выполнить ваш View отсюда без взлома исходного кода MVC.

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

3
13.10.2009 07:55:42

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

1
13.10.2009 07:55:19