/// <summary> /// 查找自动Submit的方法 /// </summary> /// <param name="controllerContext"></param> /// <param name="actionName"></param> /// <returns></returns> public MethodInfo FindSubmitAction(ControllerContext controllerContext) { string[] keys = controllerContext.HttpContext.Request.Form.AllKeys; List <MethodInfo> matchingAliasedMethods = new List <MethodInfo>(0); string actionName = string.Empty; foreach (var item in keys) { matchingAliasedMethods = GetMatchingAliasedMethods(controllerContext, item); if (matchingAliasedMethods.Any()) { actionName = item; break; } } matchingAliasedMethods.AddRange(this.NonAliasedMethods[actionName]); List <MethodInfo> list = ActionMethodSelector.RunSelectionFilters(controllerContext, matchingAliasedMethods); switch (list.Count) { case 0: return(null); case 1: return(list[0]); default: throw this.CreateAmbiguousMatchException(list, actionName); } }
/// <summary> /// 查找指定动作的方法 /// </summary> /// <param name="controllerContext"></param> /// <param name="actionName"></param> /// <returns></returns> public MethodInfo FindActionMethod(ControllerContext controllerContext, string actionName) { //添加 PageUrl过来的也走刷选器 List <MethodInfo> matchingAliasedMethods = null; if (controllerContext.RouteData.UsePageUrlRoute) { var data = controllerContext.RouteData.PageUrlData; if (data == null) { return(null); } matchingAliasedMethods = new List <MethodInfo>(1) { data.Item2 }; } else { matchingAliasedMethods = this.GetMatchingAliasedMethods(controllerContext, actionName); matchingAliasedMethods.AddRange(this.NonAliasedMethods[actionName]); } List <MethodInfo> list = ActionMethodSelector.RunSelectionFilters(controllerContext, matchingAliasedMethods); switch (list.Count) { case 0: // 如果Action的名字是submit并且是POST提交,则需要自动寻找Action // 例如:多个提交都采用一样的方式:POST /Ajax/Product/submit if (actionName.IsSame("submit") && controllerContext.HttpContext.Request.HttpMethod.IsSame("POST")) { return(FindSubmitAction(controllerContext)); } return(null); case 1: return(list[0]); default: throw this.CreateAmbiguousMatchException(list, actionName); } }
/// <summary> /// 创建一个新的 ControllerDescriptor /// </summary> /// <param name="t"></param> public ControllerDescriptor(Type t) { this.ControllerType = t; _uniqueId = new Lazy <string>(CreateUniqueId); this._selector = new ActionMethodSelector(this.ControllerType); }