1

我需要创建类似于 MVC 如何调用 Method(Action) 的方法,还需要使用 Model Binder 将 NamedValueCollection 映射到该方法的参数。基本上我有一个需要动态调用类上的方法的控制器操作,控制器具有以表单或查询字符串发送的任何信息以及作为字符串调用的方法的名称。

就我而言,这与调用动作相同。我本质上是将它传递到另一个层次(顺便说一句,我不能在控制器上使用这些方法是有充分理由的)。

我下载了 ASP.Net MVC 1.0 Source 但是有一堆类,我很难找到处理这个的代码。

我知道如何调用名称包含在字符串中的方法,但也许 MVC 使用了更好的方法。我还需要知道如何使用模型绑定器为该方法参数制作 Request.Form + Query Strings。

如果有人可以指出 MVC 源代码中执行此操作的代码,或者指出我手动在 MVC 中使用默认模型绑定器的正确方向,我将不胜感激。

让我知道我是否可以更清楚地说明这一点。

谢谢

4

1 回答 1

3

情况很复杂。FindAction 在 ControllerActionInvoker 上调用。这最终会调用 ReflectedControllerDescriptor.FindAction,后者又会调用 ActionMethodSelector.FindActionMethod,后者会调用同一类型的 RunSelectionFilters。该方法采用项圈传递给他的方法列表,并对其进行迭代,检查每个方法的参数并将它们与请求中的值进行比较。因为它必须在请求进来时快速运行,所以它们都被缓存了,而且因为它被设计为可扩展的,所以在我描述的层之间有一些抽象类型。因此,起初可能有点难以理解,并且可能难以将其重新用于非控制器逻辑。但是,您可以将其用作实现您自己的系统的模型。我认为它' 对于特定领域的应用程序来说有点太复杂了。扩展点的数量可能适合 MVC 框架,但适合您自己的代码 YAGNI。

但是,我希望这足以让您入门。

关于在没有 Web 堆栈的情况下使用模型绑定器:嗯,您仍然需要 MVC,但不一定需要 Web 服务器。以下是我们在单元测试中的做法:

    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;
    }
于 2009-10-01T16:41:35.790 回答