Inheritance: PD_StateViewModel
        public ActionResult _EditSendState(PD_SendState_ViewModel model)
        {
            var _p = _db.PD_Processes.Find(model.PD_Process_Id);
            if (User.Identity.Name.Equals(_p.LockedBy))
            {
                PD_SendState state = _db.PD_SendStates.Find(model.PD_Process_Id, model.PD_Subject_Id, model.Id);
                state.Name = model.Name;
                state.EndState = model.EndState;
                state.StartState = model.StartState;
                state.Message = Int32.Parse(model.SelectedMessage);
                _db.SaveChanges();
                if (model.AvailableEditableParameters == null) return RedirectToAction("ViewSubject", new { processid = model.PD_Process_Id, subjectid = model.PD_Subject_Id, edit = 1 });
                model.SelectedEditableParameters = new List<string>();
                foreach (var i in model.AvailableEditableParameters)
                {
                    if (i.Selected == true) model.SelectedEditableParameters.Add(i.Value);
                }
                model.SelectedReadableParameters = new List<string>();
                foreach (var i in model.AvailableReadableParameters)
                {
                    if (i.Selected == true) model.SelectedReadableParameters.Add(i.Text);
                }

                state.ReadableParameters = new PersistableStringCollection();
                if (model.SelectedReadableParameters != null)
                {
                    model.SelectedReadableParameters.ForEach(item => state.ReadableParameters.Add(item));
                }
                state.EditableParameters = new PersistableStringCollection();
                if (model.SelectedEditableParameters != null)
                {
                    model.SelectedEditableParameters.ForEach(item => state.EditableParameters.Add(item));
                }

                _db.SaveChanges();

                return RedirectToAction("ViewSubject", new { processid = model.PD_Process_Id, subjectid = model.PD_Subject_Id, edit = 1 });
            }
            else
            {
                return null;
            }
        }
        public ActionResult _EditSendState(int processid, int subjectid, int stateid, int edit)
        {
            var state = _db.PD_SendStates.Find(processid, subjectid, stateid);
            PD_SendState_ViewModel Model = new PD_SendState_ViewModel() { PD_Process_Id = state.PD_Process_Id, PD_Subject_Id = state.PD_Subject_Id, Id = state.Id, Name = state.Name, EndState = state.EndState, SelectedMessage = "" + state.Message, StartState = state.StartState };
            var messages = _db.PD_Messages.Where(result => result.PD_Process_Id == processid && result.From == subjectid).ToList();
            var j = 0; var mtid = "";
            foreach (var message in messages)
            {
                if (message.PD_MessageType_Id != null)
                {
                    var to = _db.PD_Subjects.Find(processid, message.To);
                    Model.AvailableMessages.Add(new SelectListItem() { Value = "" + message.Id, Text = to.Name + "|" + message.PD_MessageType.Name });
                    if (Model.SelectedMessage == "0" && j == 0) { 
                        Model.SelectedMessage = message.Id.ToString(); }                    
                    j++;
                }
            }
             
            try
            {
                Model.AvailableMessages.Find(result => result.Value == Model.SelectedMessage).Selected = true;
            }
            catch (Exception e) { }

            List<SelectListItem> AvailableParameters = new List<SelectListItem>();
            List<SelectListItem> SelectedEditableParameters2 = new List<SelectListItem>();
            List<SelectListItem> SelectedReadableParameters2 = new List<SelectListItem>();
            //List<string> SelectedEditableParameters = new List<string>();
            //List<string> SelectedReadableParameters = new List<string>();            
            var parameters = _db.PD_Subjects.Find(processid, subjectid).GlobalParameters;
            try
            {
                bool exists = false;
                foreach(var am in Model.AvailableMessages){
                    if(Model.SelectedMessage == am.Value) exists = true;
                }
                if (exists) { mtid = _db.PD_Messages.Find(processid, Int32.Parse(Model.SelectedMessage)).PD_MessageType.Name; }
                else { mtid = _db.PD_Messages.Find(processid, Int32.Parse(Model.AvailableMessages[0].Value)).PD_MessageType.Name; }
                //mtid = messages[Int32.Parse(Model.SelectedMessage)-1].PD_MessageType.Name;
                var patch = _db.PD_MessageTypes.Where(result => result.Name == mtid && result.PD_Process_Id == processid);
                foreach (var a in patch){ j = a.Id;}  //there is only 1...
                var parameters2 = _db.PD_MessageTypes.Find(processid, j).Parameters;
                foreach (var i in parameters2)
                {
                    var eNewSelectItem = new SelectListItem() { Value = i, Text = i, Selected = false };
                    var rNewSelectItem = new SelectListItem() { Value = i, Text = i, Selected = false };
                    AvailableParameters.Add(new SelectListItem() { Value = i, Text = i, Selected=true });
                    foreach (var f in state.ReadableParameters.ToList()) { if (f == i) rNewSelectItem.Selected = true; }
                    foreach (var g in state.EditableParameters.ToList()) { if (g == i) eNewSelectItem.Selected = true; }
                    SelectedReadableParameters2.Add(rNewSelectItem);
                    SelectedEditableParameters2.Add(eNewSelectItem);
                }
            }catch(Exception e){}            
            
            //state.EditableParameters.ToList().ForEach(e => SelectedEditableParameters.Add(e));
            Model.AvailableEditableParameters = SelectedEditableParameters2;
            //Model.SelectedEditableParameters = SelectedEditableParameters;

            //state.ReadableParameters.ToList().ForEach(e => SelectedReadableParameters.Add(e));
            Model.AvailableReadableParameters = SelectedReadableParameters2;
            //Model.SelectedReadableParameters = SelectedReadableParameters;

            ViewBag.Edit = edit;
            return PartialView(Model);
        }