請求流程片段
ControllerActionInvoker.InvokeAction() 建立 ReflectedActionDescriptor。
GetParameterValues() 遍歷 ParameterDescriptor。
GetParameterValue() 取得單一參數值,核心邏輯如下:
GetParameterValue 原始碼
protected virtual object GetParameterValue(ControllerContext cc, ParameterDescriptor pd)
{
Type pt = pd.ParameterType;
IModelBinder binder = GetModelBinder(pd);
IDictionary<string, ValueProviderResult> vp = cc.Controller.ValueProvider;
string pn = pd.BindingInfo.Prefix ?? pd.ParameterName;
Predicate<string> pf = GetPropertyFilter(pd);
var mbc = new ModelBindingContext
{
FallbackToEmptyPrefix = (pd.BindingInfo.Prefix == null),
ModelName = pn,
ModelState = cc.Controller.ViewData.ModelState,
ModelType = pt,
PropertyFilter = pf,
ValueProvider = vp
};
return binder.BindModel(cc, mbc);
}
關鍵點
ValueProvider 整合 Form、QueryString、RouteData 等資料來源。
PropertyFilter 配合 BindAttribute 實現屬性級包含/排除。
ModelBindingContext 封裝繫結上下文,供自訂 IModelBinder 使用。