Реализация паттерна PRG в asp.net mvc

PRG —  post redirect get. Все POST параметры записываются в сессию, и делается редирект на GET. После чего параметры запроса восстанавливают из сессии. Это удобно когда имеются два метода один метод GET который представляет форму, а второй метод POST который сохраняет эти данные . И в случае ошибки делается редирект на форму с уже заполненными неправильными данными.

Реализуем два метода PostRedirectGet и GetForm в базовом контроллере

  1. метод PostRedirectGet записывает форму и провалидированные данные в сессию и возвращает RedirectToRouteResult
    protected RedirectToRouteResult PostRedirectGet(string key, object form, string action, string controller, object parameters = null)
    {
        Session[key] = form;
        Session["ModelState"] = ModelState;
        return RedirectToAction(action, controller, parameters);
    }
    
  2. метод GetForm получает форму и состояния модели из сессии и возвращает форму
    protected T GetForm<T>(string key)
    {
        if (Session[key] == null) {
            Session.Remove(key);
            return default(T);
        }
        T form = (T)Session[key];
        Session.Remove(key);
        ModelState.Clear();
        var previousModelState = Session["ModelState"] as    ModelStateDictionary;
        Session.Remove("ModelState");
        if (previousModelState != null)
        {
            foreach (KeyValuePair<string, ModelState> kvp in previousModelState)
            if (!ModelState.ContainsKey(kvp.Key))
                ModelState.Add(kvp.Key, kvp.Value);
        }
        return form;
    }
    
  3. Используем так
    [HttpPost]
    public ActionResult Edit(ProductForm form, long? code, string redirectToUrl)
    {
        if (!ModelState.IsValid)
            return PostRedirectGet("ProductForm", form, "Edit", "Products", new { id = form.Id, code = code, redirectToUrl = redirectToUrl});
    ...
    }
    

    и

    public ActionResult Edit(long id, string redirectToUrl = null, long snapshotId = 0)
    {
        ProductForm form = GetForm<ProductForm>("ProductForm");
    ...
    }
    
По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *