ASP.NET MVC: использует поле делегата в качестве метода действия? - PullRequest
4 голосов
/ 13 октября 2009

Возможно ли в 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 с одной строкой кода для определения действия или различные способы распределения дублирующейся логики на нескольких контроллерах.

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

Ответы [ 3 ]

3 голосов
/ 13 октября 2009

Возможно, вам придется построить собственную фабрику контроллеров.Этот класс создает контроллеры и реализует 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.

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

1 голос
/ 13 октября 2009

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

1 голос
/ 13 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...