Asp.net mvc MVC如何调用操作并将请求映射到它&x27;s参数

Asp.net mvc MVC如何调用操作并将请求映射到它&x27;s参数,asp.net-mvc,reflection,modelbinders,controllers,Asp.net Mvc,Reflection,Modelbinders,Controllers,我需要创建一些类似于MVC调用方法(操作)的东西,还需要使用模型绑定器将NamedValueCollection映射到该方法上的参数。基本上,我有一个控制器操作,需要动态调用类上的方法,控制器有以表单或查询字符串形式发送的任何信息,以及作为字符串调用的方法的名称 就我而言,这和调用一个动作是一样的。我基本上是把它传递到另一个层次(顺便说一句,我有一个很好的理由不能在控制器上使用这些方法) 我下载了ASP.NETMVC1.0源代码,但是有很多类,我很难找到处理这些的代码 我知道如何调用名称包含在字

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

就我而言,这和调用一个动作是一样的。我基本上是把它传递到另一个层次(顺便说一句,我有一个很好的理由不能在控制器上使用这些方法)

我下载了ASP.NETMVC1.0源代码,但是有很多类,我很难找到处理这些的代码

我知道如何调用名称包含在字符串中的方法,但MVC可能使用更好的方法。我还需要知道如何使用模型绑定器向方法参数发出Request.Form+查询字符串

如果有人能为我指出MVC源代码中的代码,或者为我指出在MVC中手动使用默认模型绑定器的正确方向,我将不胜感激

如果我能说得更清楚,请告诉我


谢谢,这很复杂。在ControllerActionInvoker上调用FindAction。这最终会调用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;
    }
内部静态T绑定(字符串前缀、FormCollection集合、ModelStateDictionary modelState),其中T:BaseTimeRecordPresentationModel
{
var mbc=new ModelBindingContext()
{
ModelName=前缀,
ModelState=ModelState,
模型类型=类型(T),
ValueProvider=collection.ToValueProvider()
};
IModelBinder=新的TimeRecordModelBinder();
var cc=新的ControllerContext();
将binder.BindModel(cc,mbc)返回为T;
}
内部静态T BindAndAssertValid(字符串前缀,FormCollection集合),其中T:BaseTimeRecordPresentationModel
{
var msd=new ModelStateDictionary();
var结果=绑定(前缀、集合、msd);
如果(!msd.IsValid)
{
Assert.Fail(ModelStateValidationSummary(msd));
}
返回结果;
}

是。我找到了FindAction,开始意识到它不容易移植。我已经写了找到正确方法的部分,很简单,但是您知道是否可以手动使用模型绑定器吗?