/// <summary> /// Формирует модель для представления с формой редактирования выбранных сделок /// </summary> /// <param name="positionId">Уникальные идентификаторы сделок, перечисленные через запятую</param> private PositionsEditModel GetPositionsEditModel(string positionId) { var idArray = positionId.ToIntArrayUniform(); var positions = positionRepository.GetPositionsById(idArray); var model = new PositionsEditModel(positions); ViewBag.ListOfExitReason = new SelectList(from PositionExitReason e in Enum.GetValues(typeof(PositionExitReason)) select new { Id = (int)e, Name = e.ToString() }, "Id", "Name"); return(model); }
public ActionResult SafePositionEdit(FormCollection formCollection) { var openPositionChangedPropertyList = new List <SystemProperty>(); var closePositionChangedPropertyList = new List <SystemProperty>(); var strOpenId = String.Empty; // содержит, перечисленные через запятую, уникальные идентификаторы открытых позиций, которые нужно обновить var strCloseId = String.Empty; // -- закрытых позиций, которые нужно обновить //Список ошибок валидации. Формат: Поле - коментарий к ошибке var validationErrorList = new List <Tuple <string, string> >(); // Мапим коллекцию 'FormCollection' в списоки из элементов 'SystemProperty' // Элемент item имеет тут знаения типа "Open_Side", "Open_StopLoss" и т.п. foreach (var item in formCollection) { if (String.IsNullOrEmpty(formCollection[item.ToString()])) { continue; //Если строка оставлена пользователем пустой, тогда НЕ вносим это поле в список на редактирование } string type; string systemName; #region парсим тип свойства и его системное имя try { type = ((string)item).Split('_')[0]; systemName = ((string)item).Split('_')[1]; } catch (Exception ex) { Logger.Error(String.Format("SafePositionEdit() - не {0}", item), ex); continue; } #endregion var prop = new SystemProperty { SystemName = systemName, Value = formCollection[item.ToString()] }; if (!prop.Validation()) { validationErrorList.Add(new Tuple <string, string>(systemName, Resource.ErrorMessageInvalid)); continue; } // Поскольку в следующем switch нет случаев 'OpenDanger_', 'CloseDanger_' и 'OtherDanger_' то в выборку на // редактирование попадут только "безопасные" поля сделок #region в зависимости от состояния сделки (открыта / закрыта), запихиваем её свойство в соответствующий список из 'SystemProperty' switch (type) { case "Open": openPositionChangedPropertyList.Add(prop); break; case "Close": closePositionChangedPropertyList.Add(prop); break; case "ItemsId": if (systemName == "Open") { strOpenId = formCollection[item.ToString()]; } if (systemName == "Close") { strCloseId = formCollection[item.ToString()]; } break; } #endregion } var mess = string.Empty; mess += positionRepository.UpdateSavePositionItem(strOpenId, openPositionChangedPropertyList, PositionState.Opened) ? string.Format("{0}: {1}", Resource.MessageMarketOrderUpdate, strOpenId) : string.Format("{0}: {1} - {2}.", Resource.ErrorMessage, Resource.ErrorMessageUnableMarketOrderUpdate, strOpenId); mess += " "; mess += positionRepository.UpdateSavePositionItem(strCloseId, closePositionChangedPropertyList, PositionState.Closed) ? string.Format("{0}: {1}", Resource.MessageMarketOrderUpdate, strCloseId) : string.Format("{0}: {1} - {2}.", Resource.ErrorMessage, Resource.ErrorMessageUnableMarketOrderUpdate, strCloseId); #region Если были найдены ошибки валидации возвращаем на ту же самую страницу редактирования, но уже со списком ошибок if (validationErrorList.Count > 0) { var idArray = String.Empty; if (!String.IsNullOrEmpty(strOpenId)) { idArray += strOpenId; } if (!String.IsNullOrEmpty(strCloseId)) { idArray += "," + strCloseId; } var positions = positionRepository.GetPositionsById(idArray.ToIntArrayUniform()); var model = new PositionsEditModel(positions) { validationErrorList = validationErrorList }; return(View("SafePositionEdit", model)); } #endregion return(RedirectToAction("PositionList", new { message = mess, accountId = -1 })); }