public ActionResult FunctiesToekennen(LidFunctiesModel model, int id, int groepID)
        {
            // TODO (#1036): Dit moet een atomaire operatie zijn, om concurrencyproblemen te vermijden.
            try
            {
                ServiceHelper.CallService <ILedenService>(l => l.FunctiesVervangen(id, model.FunctieIDs));

                VeelGebruikt.FunctieProblemenResetten(groepID);

                TempData["succes"] = Resources.WijzigingenOpgeslagenFeedback;
            }
            catch (FaultException <FoutNummerFault> ex)
            {
                var    lidInfo     = ServiceHelper.CallService <ILedenService, PersoonLidInfo>(svc => svc.DetailsOphalen(id));
                string naam        = lidInfo.PersoonDetail.VolledigeNaam;
                string persoonlijk = lidInfo.PersoonDetail.Geslacht == GeslachtsType.Vrouw ? "haar" : "hem";
                string bezittelijk = lidInfo.PersoonDetail.Geslacht == GeslachtsType.Vrouw ? "haar" : "zijn";
                switch (ex.Detail.FoutNummer)
                {
                case FoutNummer.EMailVerplicht:
                    TempData["fout"] = String.Format(Resources.EmailVoorContactOntbreekt, naam,
                                                     persoonlijk);
                    break;

                case FoutNummer.ContactMoetNieuwsBriefKrijgen:
                    TempData["fout"] = String.Format(Resources.ContactMoetNieuwsBriefKrijgen, naam, bezittelijk);
                    break;

                default:
                    throw;
                }
            }
            return(RedirectToAction("Bewerken", "Personen", new { groepID, id = model.Persoon.GelieerdePersoonID }));
        }
        public JsonResult TypeToggle(int id, int groepID)
        {
            var nieuwLidId = 0;

            // TODO (#1812): Feedback van callbackfunctie standaardiseren.

            try
            {
                nieuwLidId = ServiceHelper.CallService <ILedenService, int>(svc => svc.TypeToggle(id));
                VeelGebruikt.LedenProblemenResetten(groepID);
                VeelGebruikt.FunctieProblemenResetten(groepID);
            }
            catch (FaultException <FoutNummerFault> ex)
            {
                return(Json("{\"fout\" : \"" + ex.Message + "\"}")); // moet met strip tags??
            }
            return(Json("{ \"succes\" : \"" + nieuwLidId + "\"}"));
        }
        /// <summary>
        /// Schrijft via de backend de gelieerde personen met gegeven <paramref name="gelieerdePersoonIDs"/> uit
        /// uit de groep met gegeven <paramref name="groepID"/>.
        /// </summary>
        /// <param name="gelieerdePersoonIDs">ID's uit te schrijven gelieerde personen</param>
        /// <param name="groepID">ID van groep waarvoor uit te schrijven</param>
        /// <param name="succesboodschap">Feedback die gegeven zal worden bij succes</param>
        protected void GelieerdePersonenUitschrijven(IList <int> gelieerdePersoonIDs, int groepID, string succesboodschap)
        {
            // Ik vind het een beetje vreemd dat het succesbericht hier een parameter is.

            var fouten = String.Empty;             // TODO (#1035): fouten opvangen

            ServiceHelper.CallService <ILedenService>(l => l.Uitschrijven(gelieerdePersoonIDs, out fouten));

            // TODO (#1035): beter manier om problemen op te vangen dan via een string

            if (fouten == String.Empty)
            {
                TempData["succes"] = succesboodschap;

                VeelGebruikt.FunctieProblemenResetten(groepID);
                VeelGebruikt.LedenProblemenResetten(groepID);
            }
            else
            {
                // TODO (#1035): vermijden dat output van de back-end rechtstreeks zichtbaar wordt voor de user.
                TempData["fout"] = fouten;
            }
        }