如何MVC调用操作和地图的Request.Form到它的参数
-
19-09-2019 - |
题
我需要创建类似于MVC如何调用一个方法(作用)和也使用模型绑定映射一个NamedValueCollection到对方法的参数的东西。基本上我有一个需要动态地调用一个方法上的类的控制器的动作,所述控制器具有在形式或查询字符串加以调用作为字符串的方法的名称发送的任何信息。
据我所关注的是一样的调用动作。我基本上是向下传递另一个层次(有一个很好的理由,我不能在控制器上这些方法的BTW)。
我下载的ASP.Net MVC 1.0来源但也有一堆类,我无法发现处理此代码。
我知道如何调用它的名称包含在一个字符串的方法,但也许有是MVC使用更好的方法。我还需要知道如何使用模型绑定进行的Request.Form +查询字符串到该方法的参数。
如果任何人都可以点我要么在做这个或关于使用默认的模型绑定在MVC人工本人将不胜感激指向我的方向是正确的MVC源代码。
让我知道如果我可以让这个更清晰。
由于
解决方案
很复杂。 FindAction叫上ControllerActionInvoker。这就要求,最终,ReflectedControllerDescriptor.FindAction,进而调用ActionMethodSelector.FindActionMethod,要求对同一类型RunSelectionFilters。该方法采用的方法列表超过了他的衣领,并重复他们,检查每个方法的参数,并将它们与请求中的值进行比较。因为这有快速运行的请求进来,这是所有缓存,因为它的设计是可扩展的,也有一些抽象类型中我描述的这些层之间。因此,它可以是一个有点难以跟随在第一,它可能会很困难也可以将其用于非控制器逻辑。但是,你可以使用它作为实现自己的系统的模型。我认为这是一个特定领域的应用有点太复杂了。扩展点的数量可能是适合的MVC框架,但对自己的代码,YAGNI。
我希望这给你足以让但开始。
关于使用模型绑定没有网络堆栈:嗯,你还需要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;
}