/// <summary> /// Responds the specified context. /// </summary> /// <param name="context">The context.</param> public override void Respond(ResponderContext context) { Invariant.IsNotNull(context, "context"); ControllerContext controllerContext = context.ControllerContext; string action = controllerContext.RouteData.ActionName().ToLower(CultureInfo.CurrentCulture); ModelStateDictionary modelState = controllerContext.Controller.ViewData.ModelState; HttpResponseBase httpResponse = controllerContext.HttpContext.Response; if (KnownActionNames.Destroy.Equals(action)) { BuildResponse(null, (int)HttpStatusCode.OK, httpResponse); return; } if (!modelState.IsValid && KnownActionNames.CreateAndUpdate().Contains(action)) { IEnumerable<ModelStateError> errors = modelState.Select(ms => new { key = ms.Key, errors = ms.Value.Errors.Select(error => (error.Exception == null) ? error.ErrorMessage : error.Exception.Message) }) .Where(ms => ms.errors.Any()) // No need to include model state that does not have error .Select(e => new ModelStateError { Key = e.key, Messages = e.errors.ToList() }) .ToList(); BuildResponse(errors, 422, httpResponse); // No equivalent .NET HttpStatusCode, Unprocessable Entity, ref http://www.iana.org/assignments/http-status-codes return; } BuildResponse(context.Model, (int)(KnownActionNames.Create.Equals(action) ? HttpStatusCode.Created : HttpStatusCode.OK), controllerContext.HttpContext.Response); }
/// <summary> /// Responds the specified context. /// </summary> /// <param name="context">The context.</param> public override void Respond(ResponderContext context) { Invariant.IsNotNull(context, "context"); ControllerContext controllerContext = context.ControllerContext; string action = controllerContext.RouteData.ActionName().ToLower(CultureInfo.CurrentCulture); ModelStateDictionary modelState = controllerContext.Controller.ViewData.ModelState; HttpResponseBase httpResponse = controllerContext.HttpContext.Response; if (KnownActionNames.Destroy.Equals(action)) { BuildResponse(null, (int)HttpStatusCode.OK, httpResponse); return; } if (!modelState.IsValid && KnownActionNames.CreateAndUpdate().Contains(action)) { IEnumerable <ModelStateError> errors = modelState.Select(ms => new { key = ms.Key, errors = ms.Value.Errors.Select(error => (error.Exception == null) ? error.ErrorMessage : error.Exception.Message) }) .Where(ms => ms.errors.Any()) // No need to include model state that does not have error .Select(e => new ModelStateError { Key = e.key, Messages = e.errors.ToList() }) .ToList(); BuildResponse(errors, 422, httpResponse); // No equivalent .NET HttpStatusCode, Unprocessable Entity, ref http://www.iana.org/assignments/http-status-codes return; } BuildResponse(context.Model, (int)(KnownActionNames.Create.Equals(action) ? HttpStatusCode.Created : HttpStatusCode.OK), controllerContext.HttpContext.Response); }
/// <summary> /// Responds the specified context. /// </summary> /// <param name="context">The context.</param> public override void Respond(ResponderContext context) { Invariant.IsNotNull(context, "context"); if (RespondToExplicitView(context)) { return; } if (RespondToExplicitRedirect(context)) { return; } // Nothing explicit so continue with default behavior ControllerContext controllerContext = context.ControllerContext; ControllerBase controller = controllerContext.Controller; string action = controllerContext.RouteData.ActionName().ToLower(CultureInfo.CurrentCulture); if (KnownActionNames.Destroy.Equals(action) || (controller.ViewData.ModelState.IsValid && KnownActionNames.CreateAndUpdate().Contains(action))) { InjectFlashMessages(context); new RedirectToRouteResult(new RouteValueDictionary(new { action = KnownActionNames.Index })).ExecuteResult(controllerContext); return; } controller.ViewData.Model = context.Model; string view = action; // If we reached here for create or update action, then the model state is not valid // so we have to toggle the view name if (KnownActionNames.Create.Equals(action)) { view = KnownActionNames.New; } else if (KnownActionNames.Update.Equals(action)) { view = KnownActionNames.Edit; } else { InjectFlashMessages(context); } (new ViewResult { ViewName = view, ViewData = controller.ViewData, TempData = controller.TempData }).ExecuteResult(controllerContext); }
private static void InjectFlashMessages([NotNull] ResponderContext context) { if (!context.FlashMessages.Any()) { return; } FlashStorage flashStorage = new FlashStorage(context.ControllerContext.Controller.TempData); foreach (KeyValuePair <string, string> pair in context.FlashMessages) { flashStorage.Add(pair.Key, pair.Value); } }
private static bool RespondToExplicitRedirect([NotNull] ResponderContext context) { if (string.IsNullOrWhiteSpace(context.RedirectAction) && string.IsNullOrWhiteSpace(context.RedirectController) && !context.RedirectRouteValues.Any()) { // No explicit view specified so do not continue. return(false); } InjectFlashMessages(context); RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(context.RedirectAction, context.RedirectController, !context.RedirectRouteValues.Any() ? null : context.ControllerContext.RouteData.Values, context.RedirectRouteValues, true); new RedirectToRouteResult(mergedRouteValues).ExecuteResult(context.ControllerContext); return(false); }
private static bool RespondToExplicitView(ResponderContext context) { if (string.IsNullOrWhiteSpace(context.ViewName) && string.IsNullOrWhiteSpace(context.MasterName)) { // No explicit view specified so do not continue. return false; } InjectFlashMessages(context); ControllerContext controllerContext = context.ControllerContext; // if explicit view is specified then use it otherwise fallback to action name; string view = context.ViewName ?? controllerContext.RouteData.ActionName(); ControllerBase controller = controllerContext.Controller; (new ViewResult { ViewName = view, MasterName = context.MasterName, ViewData = controller.ViewData, TempData = controller.TempData }).ExecuteResult(controllerContext); return true; }
/// <summary> /// Responds the specified context. /// </summary> /// <param name="context">The context.</param> public abstract void Respond([NotNull] ResponderContext context);
/// <summary> /// Responds the specified context. /// </summary> /// <param name="context">The context.</param> public abstract void Respond(ResponderContext context);
private static void InjectFlashMessages(ResponderContext context) { if (!context.FlashMessages.Any()) { return; } FlashStorage flashStorage = new FlashStorage(context.ControllerContext.Controller.TempData); foreach (KeyValuePair<string, string> pair in context.FlashMessages) { flashStorage.Add(pair.Key, pair.Value); } }
private static bool RespondToExplicitRedirect(ResponderContext context) { if (string.IsNullOrWhiteSpace(context.RedirectAction) && string.IsNullOrWhiteSpace(context.RedirectController) && !context.RedirectRouteValues.Any()) { // No explicit view specified so do not continue. return false; } InjectFlashMessages(context); RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(context.RedirectAction, context.RedirectController, !context.RedirectRouteValues.Any() ? null : context.ControllerContext.RouteData.Values, context.RedirectRouteValues, true); new RedirectToRouteResult(mergedRouteValues).ExecuteResult(context.ControllerContext); return false; }