コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
ファイル: HtmlResponder.cs プロジェクト: rootzhou/Core
        /// <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);
        }
コード例 #4
0
ファイル: HtmlResponder.cs プロジェクト: rootzhou/Core
        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);
            }
        }
コード例 #5
0
ファイル: HtmlResponder.cs プロジェクト: nomit007/Core
        /// <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);
        }
コード例 #6
0
ファイル: HtmlResponder.cs プロジェクト: rootzhou/Core
        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);
        }
コード例 #7
0
ファイル: HtmlResponder.cs プロジェクト: artem-kovalev/Core
        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;
        }
コード例 #8
0
 /// <summary>
 /// Responds the specified context.
 /// </summary>
 /// <param name="context">The context.</param>
 public abstract void Respond([NotNull] ResponderContext context);
コード例 #9
0
 /// <summary>
 /// Responds the specified context.
 /// </summary>
 /// <param name="context">The context.</param>
 public abstract void Respond(ResponderContext context);
コード例 #10
0
ファイル: HtmlResponder.cs プロジェクト: nomit007/Core
        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);
            }
        }
コード例 #11
0
ファイル: HtmlResponder.cs プロジェクト: nomit007/Core
        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;
        }
コード例 #12
0
ファイル: HtmlResponder.cs プロジェクト: nomit007/Core
        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;
        }
コード例 #13
0
ファイル: Responder.cs プロジェクト: nomit007/Core
 /// <summary>
 /// Responds the specified context.
 /// </summary>
 /// <param name="context">The context.</param>
 public abstract void Respond(ResponderContext context);