public ActionResult GetConfigClassInfoOfCustomHandler(string customHandlerTypeName) { //获取目标类型 Type targetType = CustomHandlerConfig.GetICustomHandlerTypeFromCurrentDomain(customHandlerTypeName); if (targetType == null) { return(Json(new { IsConfigable = false })); } //检查是否可配置 bool isConfigable = typeof(ICustomHandlerConfigable).IsAssignableFrom(targetType); if (isConfigable == false) { return(Json(new { IsConfigable = false })); } //获取配置用的URL string url = CustomHandlerAdvantanceConfigUrls.GetConfigUrl(targetType); if (String.IsNullOrEmpty(url)) { url = "about:blank"; //BlankPage } else { url = Url.Action("Index", url); //ActionName,ControllName } //返回结果 return(Json(new { IsConfigable = true, Url = url })); }
/// <summary> /// Handler配置类,辅助获取当前配置信息的概要描述 /// </summary> /// <typeparam name="T_IHandler"></typeparam> /// <param name="config"></param> /// <returns></returns> public static string GetSummary(this IHandlerConfig config) { if (config is DefaultDealingHandlerConfig) { var realConfig = config as DefaultDealingHandlerConfig; switch (realConfig.DataType) { case DataTypes.Text: return(String.Format("呈現指定的文本({0})", GetShortString(realConfig.RawData.ToString()))); case DataTypes.News: return(String.Format("呈現指定的文章({0})", GetShortString(((ArticleCan)realConfig.RawData).Title))); default: return(DescriptionAttribute.GetDescription(config.GetType().GetMethod("CreateInstanceFromConfig").ReturnType)); } } else if (config is DefaultDoneHandlerConfig) { var realConfig = config as DefaultDoneHandlerConfig; if (realConfig.NodeId == ConstString.ROOT_NODE_ID) { return("輸入任意文字,返回主功能表"); } else { return(String.Format("輸入#時,{0}(節點:{1})", realConfig.TipText, realConfig.NodeId)); } } else if (config is TextMenuHandlerConfig) { var realConfig = config as TextMenuHandlerConfig; string nodes = String.Join(" | ", realConfig.Menus.Select(keyvalue => keyvalue.Value)); return(String.Format("跳轉菜單({0}個功能表項目,節點:{1})", realConfig.Menus.Count, nodes)); } else if (config is CustomHandlerConfig) { Type targetType = CustomHandlerConfig.GetICustomHandlerTypeFromCurrentDomain(((CustomHandlerConfig)config).HandlerTypeName); return(DescriptionAttribute.GetDescription(targetType)); } else { return(DescriptionAttribute.GetDescription(config.GetType().GetMethod("CreateInstanceFromConfig").ReturnType)); } }
/// <summary> /// 删除指定的节点 /// </summary> /// <returns></returns> public ActionResult Delete(string nodeID, string CallBackIndexView = "Index") { if (ConfigNodeList != null) { lock (((ICollection)ConfigNodeList).SyncRoot) { if (nodeID != ConstString.ROOT_NODE_ID && ConfigNodeList.ContainsKey(nodeID)) { #region 自定义处理器的额外处理 //自定义处理的参数配置 if (ConfigNodeList[nodeID].DealingHandlerConfig is CustomHandlerConfig) { CustomHandlerConfig hd = ConfigNodeList[nodeID].DealingHandlerConfig as CustomHandlerConfig; Type targetType = CustomHandlerConfig.GetICustomHandlerTypeFromCurrentDomain(hd.HandlerTypeName); bool isConfigable = typeof(ICustomHandlerConfigable).IsAssignableFrom(targetType); if (isConfigable) { //获取配置类 Type configClassType = ConfigClassOfCustomHandlerHelper.GetConfigClassType(targetType); if (configClassType != null) { //加载 XDocument xdoc = ConfigClassOfCustomHandlerHelper.LoadConfigByType(configClassType); ConfigClassOfCustomHandlerHelper.RemoveConfig(xdoc, nodeID); //保存 ConfigClassOfCustomHandlerHelper.SaveConfigByType(configClassType, xdoc); } } } #endregion ConfigNodeList.Remove(nodeID); //写入到配置文件 ResponseConfiguration.SaveConfig_ResponseChain(ConfigNodeList.Values.ToArray()); } } } LoadDatas(); return(View(CallBackIndexView)); }
public ActionResult SaveEdit(Dictionary <string, string> parmDic) { /* Doubt: 只能序列化成 <Stirng,String>? 当使用<Stirng,dynamic>,无法为Value赋值"集合"/"JObject";会转换成无法使用的 System.Object? * * 因此这里的“DefaultNews”和 “TextMenu”, * 从View层序列化成 JsonString,然后再在Controller还原。 * 求解决方案。 */ //抽取基本数据 string targetNodeId = parmDic["NodeID"]; string NewNodeId = parmDic["NewNodeId"]; string DealingHandler = parmDic["DealingHandler"]; string DoneHandler = parmDic["DoneHandler"]; //检查ID是否重复、格式是否正确 if (targetNodeId != ConstString.ROOT_NODE_ID && targetNodeId != NewNodeId) //修改了NodeID时才检查 { if (NodeIdValidator.IsValid(NewNodeId) == false) { return(Json(new { IsSuccess = false, errorMessage = "節點ID格式不正確。必須為 x.y.z 序號格式。" })); } bool isExisted = false; lock (((ICollection)ConfigNodeList).SyncRoot) isExisted = ConfigNodeList.ContainsKey(NewNodeId); if (isExisted) { return(Json(new { IsSuccess = false, errorMessage = "修改的節點ID已經存在,不可以重複。" })); } } ResponseNodeConfig configNode = new ResponseNodeConfig(NewNodeId); StringBuilder errorMessage = new StringBuilder(); //开始根据不同类型,解析具体的数据 bool isNeedDoneHandler = true; //标记是否需要Done阶段;因为有部分Dealing处理器,处理完则跳转节点,此时不需要再配置Done。 #region DealingHandler switch (DealingHandler) { default: errorMessage.AppendLine("找不到對應的Dealing類型。"); break; case "DefaultText": { DefaultDealingHandlerConfig HandlerResult = new DefaultDealingHandlerConfig(); HandlerResult.DataType = DataTypes.Text; HandlerResult.RawData = parmDic["DealingHandler_DefaultText"]; configNode.DealingHandlerConfig = HandlerResult; } break; case "DefaultNews": { DefaultDealingHandlerConfig HandlerResult = new DefaultDealingHandlerConfig(); HandlerResult.DataType = DataTypes.News; dynamic news = Newtonsoft.Json.Linq.JObject.Parse(parmDic["DealingHandler_DefaultNews"]); HandlerResult.RawData = new ArticleCan(news.title.ToString(), news.description.ToString(), news.picUrl.ToString(), news.pageUrl.ToString()); configNode.DealingHandlerConfig = HandlerResult; } break; case "TextMenu": { TextMenuHandlerConfig HandlerResult = new TextMenuHandlerConfig(); //##提示文字 ResponseTextMessageConfig ready = new ResponseTextMessageConfig(); ready.Context = parmDic["DealingHandler_TextMenu_ReadyMessage"]; HandlerResult.ReadyMessageConfig = ready; //##菜单项 var menus = Newtonsoft.Json.Linq.JObject.Parse(parmDic["DealingHandler_TextMenu_Menus"]); foreach (var menu in menus) { string theNodeid = menu.Value["Id"].ToString().Replace("#", String.Empty); //??Json序列化时,如果Key为纯数字(即使类型是字符串),会被排序。因此这个用#前缀处理。 //有效性检查 if (NodeIdValidator.IsValid(theNodeid) == false) { errorMessage.Append(theNodeid); errorMessage.AppendLine("不是有效的節點ID格式。必須為 x.y.z 序號格式。"); break; } //重复检查(紧跟其下的目标跳转的节点ID,不能与当前节点ID一样,否则会直接循环跳转 ; 跨节点的,不限制。) if (String.Equals(NewNodeId, theNodeid, StringComparison.OrdinalIgnoreCase)) { errorMessage.Append("子節點"); errorMessage.Append(theNodeid); errorMessage.AppendLine(",不能與當前節點的ID重複。"); break; } HandlerResult.Menus.Add(new DictionaryEntry(menu.Value["data"].ToString(), theNodeid)); } configNode.DealingHandlerConfig = HandlerResult; isNeedDoneHandler = false; //标记不处理Done } break; case "CustomHandler": { CustomHandlerConfig HandlerResult = new CustomHandlerConfig(); HandlerResult.HandlerTypeName = parmDic["DealingHandler_CustomHandler"]; configNode.DealingHandlerConfig = HandlerResult; //自定义处理的参数配置 Type targetType = CustomHandlerConfig.GetICustomHandlerTypeFromCurrentDomain(HandlerResult.HandlerTypeName); bool isConfigable = typeof(ICustomHandlerConfigable).IsAssignableFrom(targetType); if (isConfigable && Session["AdvantanceConfig_CustomHandler_Result"] != null) { var dictionary = Session["AdvantanceConfig_CustomHandler_Result"] as IDictionary <Type, IConfigClassOfCustomHandler>; if (dictionary != null && dictionary.ContainsKey(targetType)) { IConfigClassOfCustomHandler configData = dictionary[targetType] as IConfigClassOfCustomHandler; if (configData != null) { //获取配置类 Type configClassType = ConfigClassOfCustomHandlerHelper.GetConfigClassType(targetType); if (configClassType != null) { //加载 XDocument xdoc = ConfigClassOfCustomHandlerHelper.LoadConfigByType(configClassType); ConfigClassOfCustomHandlerHelper.RemoveConfig(xdoc, targetNodeId); ConfigClassOfCustomHandlerHelper.UpdateConfig(xdoc, NewNodeId, configData); //保存 ConfigClassOfCustomHandlerHelper.SaveConfigByType(configClassType, xdoc); } } } } } break; } #endregion #region DoneHandler if (isNeedDoneHandler) { switch (DoneHandler) { default: errorMessage.AppendLine("找不到對應的Done類型。"); break; case "DefaultRootNode": { //DefaultDoneHandlerConfig HandlerResult = new DefaultDoneHandlerConfig(); configNode.DoneHandlerConfig = null; } break; case "DefaultTargetNode": { if (NodeIdValidator.IsValid(parmDic["DoneHandler_JumpNode"]) == false) { errorMessage.Append(parmDic["DoneHandler_JumpNode"]); errorMessage.AppendLine("不是有效的節點ID格式。必須為 x.y.z 序號格式。"); break; } DefaultDoneHandlerConfig HandlerResult = new DefaultDoneHandlerConfig(); HandlerResult.NodeId = parmDic["DoneHandler_JumpNode"]; HandlerResult.TipText = parmDic["DoneHandler_TipText"]; configNode.DoneHandlerConfig = HandlerResult; } break; } } #endregion //反馈结果 if (errorMessage.Length <= 0) { SaveOneConfig(configNode, targetNodeId); return(Json(new { IsSuccess = true })); } else { return(Json(new { IsSuccess = false, errorMessage = errorMessage.ToString() })); } }