程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Asp.Net Mvc: Model Binding 機制分析

Asp.Net Mvc: Model Binding 機制分析

編輯:關於ASP.NET

環境:

Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1

請求過程片段:

在請求的Action被調用之前,ControllerActionInvoker.InvokeAction()方法被調用,在這個方法裡 面,有一個ReflectedActionDescriptor的實例會被構建,這個實例包含Action的描述信息。

接著,ControllerActionInvoker.GetParameterValues()方法被調用,通過傳入的之前創建的 ReflectedActionDescriptor實例,獲取Action參數列表(對應的ParameterDescriptor的實例分別被創建 ),進而遍歷各參數,嘗試獲取參數的值,在遍歷的循環裡面, ControllerActionInvoker.GetParameterValue()方法被調用。

以下就是ControllerActionInvoker.GetParameterValue()方法的源代碼:

protected virtual object GetParameterValue(ControllerContext controllerContext, 

ParameterDescriptor parameterDescriptor) {

            // collect all of the necessary binding properties

            Type parameterType = parameterDescriptor.ParameterType;

            IModelBinder binder = GetModelBinder(parameterDescriptor);

            IDictionary<string, ValueProviderResult> valueProvider = 

controllerContext.Controller.ValueProvider;

            string parameterName = parameterDescriptor.BindingInfo.Prefix ?? 

parameterDescriptor.ParameterName;

            Predicate<string> propertyFilter = GetPropertyFilter

(parameterDescriptor);

            // finally, call into the binder

            ModelBindingContext bindingContext = new ModelBindingContext() {

                FallbackToEmptyPrefix = 

(parameterDescriptor.BindingInfo.Prefix == null), // only fall back if prefix not specified

                ModelName = parameterName,

                ModelState = 

controllerContext.Controller.ViewData.ModelState,

                ModelType = parameterType,

                PropertyFilter = propertyFilter,

                ValueProvider = valueProvider

            };

            object result = binder.BindModel(controllerContext, bindingContext);

            return result;

        }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved