2016-04-22 2 views
2

Я новичок в ASP.Net MVC. В PHP я всегда использую шаблон PRG, даже если почтовый запрос недействителен. Это было довольно легко с сессионными вспышками (также удобными для пользователя).PRG Pattern в ASP.Net MVC?

В ASP.Net MVC, однако, я не вижу простого способа выполнить PRG, когда запрос недействителен. Я мог бы подумать о некоторых способах, но я не думаю, что они хорошие практики и лишний лишний труд.

Кроме того, из нескольких статей, которые я прочитал, PRG, когда запрос был недействительным, был обескуражен. Если это плохая практика, то каков наилучший способ обработки неуспешных почтовых запросов? Это действительно лучше без PRG? Должен ли я просто допустить раздражающие предупреждения браузера, когда пользователь пытается обновить страницу?

+1

Нормальная практика для возвращения зрения является 'ModelState' недействительна так что сообщения об ошибках проверки отображаются. –

+0

@StephenMuecke я понимаю. Но является ли запрос POST хорошим или приемлемым? Я имею в виду, когда вы обновляете все предупреждения браузера? – christianleroy

+0

Да, это немного боль. Я видел некоторые попытки следовать шаблону PRG и по-прежнему поддерживать «ModelState», например, в [этом блоге] (http://www.jefclaes.be/2012/06/persisting-model-state-when-using-prg. html) (но не используйте 'TempData' - если вы обновите его, если вы не используете' .keep() 'или' .peek() ') –

ответ

0

В Mvc, это нормальная практика для обработки Разместить свои действия, как это следующим образом:

[HttpPost] 
[ValidateAntiForgeryToken] 
public virtual ActionResult LoginForm(LoginViewModel loginViewModel) 
{ 
    if (!ModelState.IsValid) 
     return View("Login", loginViewModel); 

    return Redirect("/"); 
} 

Как вы можете видеть, свойство ModelState.IsValid сообщит вам, если запрос является недействительным, поэтому дает вам возможность для возврата одного и того же вида и отображения сообщений об ошибках в ValidationSummary, когда запрос Post содержит ошибку. Это код Вид:

@using (Html.BeginForm("LoginForm", "Account"})) 
    { 
     @Html.ValidationSummary() // THIS WILL SHOW THE ERROR MESSAGES 
     @Html.AntiForgeryToken() 
     @Html.TextBoxFor(x => x.Email) 
     @Html.PasswordFor(x => x.Password) 
     <button type="submit">Submit</button> 
    } 
-1

Мы используем PRG шаблон в наших ASP.NET MVC веб-приложений, в течение 5 лет. Основной причиной, по которой мы приняли PRG, была поддержка навигации браузера (например, назад, вперед). Наши веб-приложения используются клиентом и для работы на фронте/бэк-офисе. Наш типичный поток веб-страниц начинается с входа в систему, а затем продвигается через много видов списка/подробностей. Мы также включаем частичные взгляды, которые также имеют свою собственную модель взгляда. В представлениях списка будут ссылки (GETS) для навигации. Подробные представления будут иметь формы (POSTS) для навигации.

Клавишные аспекты нашего PRG:

  1. Мы включаем ViewModels так что каждый вид имеет ViewModel (доступ ко всем данным осуществляется в ViewModel).
  2. Каждая модель имеет набор() & метод get() для сохранения значений полей ключевых данных, связанных с последним экземпляром представления. Значения set/get сохраняются в sessionstate.
  3. У метода set есть параметр для каждого значения, которое необходимо установить. Метод get просто вызывается из конструктора viewmodel для заполнения общедоступных «ключевых» значений viewmodel.
  4. Viewmodel также будет иметь общедоступный метод load(), который получает все необходимые данные для своего вида.

Наш обзор PRG картина:

  1. В контроллерах есть отдельный метод GET и метод POST для каждого действия. GET отображает только представление; POST обрабатывает опубликованные данные.
  2. Для просмотра списка (меню), метод GET контроллера вызывает метод целевого представления ('this value values ​​here'), а затем вызывает RedirectToAction для действия GET контроллера целевого представления.
  3. Метод GET контроллера будет создавать экземпляр модели представления (тем самым вызывая получение заданных значений), вызвать свой метод загрузки, который использует значения ключа/get key для получения данных и возвращает view/viewmodel.
  4. Метод POST контроллера будет либо иметь режим просмотра, чтобы сохранить достоверные опубликованные данные, а затем перенаправить на следующую желаемую страницу (возможно, в предыдущее меню списка) -ИЛИ-, если повторно отобразить текущий вид, если данные недействительны.
  5. Я не документировал все сенарии потока PRG, которые мы реализовали, но приведенный выше является основным потоком.

ОБРАЗЦА ViewModel SET/GET МЕТОДЫ

private void GetKeys() { 
    Hashtable viewModelKeys; 
    if (SdsuSessionState.Exists("RosterDetail")) 
    { 
    viewModelKeys = (Hashtable)SdsuSessionState.Get("RosterDetail"); 
    EventId   = (int)viewModelKeys["EventId"]; 
    SessionNo  = (int)viewModelKeys["SessionNo"]; 
    viewModelKeys = null; 
    } 
} 
public static void SetKeys(int eventId, int sessionNo) { 
    Hashtable viewModelKeys = new Hashtable(); 
    viewModelKeys.Add("EventId",eventId); 
    viewModelKeys.Add("SessionNo",sessionNo); 
    SdsuSessionState.Set("RosterDetail",viewModelKeys); 
    viewModelKeys = null; 
} 

ОБРАЗЦА CONTROLLER

[AcceptVerbs("Get")] 

public ActionResult MenuLink(int eventId, int sessionNo, string submitButton) { 
    if (submitButton == RosterMenu.Button.PrintPreview) { 
    // P-R-G: set called viewmodel keys. 
    RosterDetail.SetKeys(eventId,sessionNo); 
    // Display page. 
    return RedirectToAction("Detail","Roster"); 
    } 
    if (submitButton == RosterMenu.Button.Export) { etc ...} 
}