Hellooo….. Today post I will talk about what is PRG in ASP.NET MVC 4 and how to use it. Before we start, the question is what is PRG?
What is the PRG Pattern ?
- PRG stands for "Post/Redirect/Get"
- Instead of returning an HTML page directly,
- The POST operation returns a redirection command (using the HTTP 303 response code (sometimes 302)
- together with the HTTP "Location" response header),
- Instructing the browser to load a different page using an HTTP GET request
- The result page can then safely be bookmarked or reloaded without unexpected side effects
How to Explain this by using an Example ?
- Here I'm going to use User Registration function as an example
- If the Registration attempt is Successful, the user should be redirected to his Home page
- Otherwise they should be redirected back to the Registration page
Image 1 : Shows Action Methods Interaction When do Registration
AccountController.cs
Code for the Register Action Method (Get) for Displaying Register View is as below
/// <summary>
/// for displaying Register View
/// </summary>
[HttpGet]
[AllowAnonymous]
public ActionResult Register()
{
return View();
}
Image 2 : Register View
Code for the Register Action Method (Post) for Processing the Registration and Shows Register Page again is as below
/// <summary>
/// for Registering the User
/// </summary>
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
WebSecurity.Login(model.UserName, model.Password);
ViewBag.Message = "Successfully Registered!";
return View(model);//PRG has not been Maintained
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Image 3 : New user has been Created
- At this point If you try to Refresh (F5) or Reload the Page,You'll see below mentioned kind of Security Alert Message Box
Image 4 : Register form with "Confirm Form Resubmission" Message Box
- After that If you try to press "Continue" Button, You'll see below mentioned Run time exception
- But for another situation this may be Data Duplication issue etc.
Image 5 : Run time Exception
How to Get Rid Of this Issue ?
- You have to maintain PRG Pattern with your Return type, After finishing the Successful Registration
- To properly perform PRG you must return a redirecting ViewResult from your Action
- Such as RedirectToAction, otherwise you'll get the dialog box pictured above (i.e. Image 4)
Code for the Properly Perform PRG Pattern is Maintaining Register Action Method is as below
/// <summary>
/// for Registering the User
/// </summary>
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
WebSecurity.Login(model.UserName, model.Password);
ViewBag.Message = "Successfully Registered!";
return RedirectToAction("Index", "Home");//PRG has been Maintained
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Image 6 : Home page
DONE!!