Как MVC вызывает действие и сопоставляет Request.Form с его параметрами

StackOverflow https://stackoverflow.com/questions/1504696

Вопрос

Мне нужно создать что-то похожее на то, как MVC вызывает метод (действие), а также использует связыватель модели для сопоставления NamedValueCollection с параметрами этого метода.По сути, у меня есть действие контроллера, которому необходимо динамически вызывать метод класса, контроллер имеет любую информацию, отправленную в форме или строке запроса, а также имя метода для вызова в виде строки.

Насколько я понимаю, это то же самое, что вызвать действие.По сути, я передаю его на другой уровень (кстати, есть веская причина, по которой я не могу использовать эти методы на контроллере).

Я загрузил исходный код ASP.Net MVC 1.0, но там есть несколько классов, и мне не удается найти код, который обрабатывает это.

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

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

Дайте мне знать, если я смогу прояснить это.

Спасибо

Это было полезно?

Решение

Все сложно.FindAction вызывается в ControllerActionInvoker.В конечном итоге это вызывает ReflectedControllerDescriptor.FindAction, который, в свою очередь, вызывает ActionMethodSelector.FindActionMethod, который вызывает RunSelectionFilters того же типа.Этот метод принимает список переданных ему методов и повторяет их, проверяя аргументы каждого метода и сравнивая их со значениями в запросе.Поскольку это должно выполняться быстро при поступлении запроса, все это кэшируется, и поскольку оно спроектировано с возможностью расширения, между уровнями, которые я описал, есть несколько абстрактных типов.Следовательно, поначалу может быть немного сложно следовать этому алгоритму, и, вероятно, будет сложно перепрофилировать его для неконтроллерной логики.Однако вы можете использовать его как модель для реализации своей собственной системы.Я думаю, что это слишком сложно для приложения, специфичного для предметной области.Количество точек расширения, вероятно, подходит для платформы MVC, но для вашего собственного кода YAGNI.

Однако я надеюсь, что это даст вам достаточно информации для начала.

Что касается использования связующего устройства без веб-стека:Что ж, вам все равно нужен MVC, но не обязательно веб-сервер.Вот как мы это делаем в модульном тесте:

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
    {
        var mbc = new ModelBindingContext()
        {
            ModelName = prefix,
            ModelState = modelState,
            ModelType = typeof(T),
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new TimeRecordModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top