Can we pass model as a parameter in RedirectToAction?

asp.net Mvcasp.net Mvc-3asp.net Mvc-4Controller

asp.net Mvc Problem Overview


I want to know, there is any technique so we can pass Model as a parameter in RedirectToAction

For Example:

public class Student{
	public int Id{get;set;}
	public string Name{get;set;}
}

Controller

public class StudentController : Controller
{
	public ActionResult FillStudent()
	{
		return View();
	}
	[HttpPost]
	public ActionResult FillStudent(Student student1)
	{
		return RedirectToAction("GetStudent","Student",new{student=student1});
	}
	public ActionResult GetStudent(Student student)
	{
		return View();
	}
}

My Question - Can I pass student model in RedirectToAction?

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

Using TempData

> Represents a set of data that persists only from one request to the > next

[HttpPost]
public ActionResult FillStudent(Student student1)
{
    TempData["student"]= new Student();
    return RedirectToAction("GetStudent","Student");
}

[HttpGet]
public ActionResult GetStudent(Student passedStd)
{
    Student std=(Student)TempData["student"];
    return View();
}

Alternative way Pass the data using Query string

return RedirectToAction("GetStudent","Student", new {Name="John", Class="clsz"});

This will generate a GET Request like Student/GetStudent?Name=John & Class=clsz

> Ensure the method you want to redirect to is decorated with [HttpGet] as > the above RedirectToAction will issue GET Request with http status > code 302 Found (common way of performing url redirect)

Solution 2 - asp.net Mvc

Just call the action no need for redirect to action or the new keyword for model.

 [HttpPost]
    public ActionResult FillStudent(Student student1)
    {
        return GetStudent(student1); //this will also work
    }
    public ActionResult GetStudent(Student student)
    {
        return View(student);
    }

Solution 3 - asp.net Mvc

Yes you can pass the model that you have shown using

return RedirectToAction("GetStudent", "Student", student1 );

assuming student1 is an instance of Student

which will generate the following url (assuming your using the default routes and the value of student1 are ID=4 and Name="Amit")

.../Student/GetStudent/4?Name=Amit

Internally the RedirectToAction() method builds a RouteValueDictionary by using the .ToString() value of each property in the model. However, binding will only work if all the properties in the model are simple properties and it fails if any properties are complex objects or collections because the method does not use recursion. If for example, Student contained a property List<string> Subjects, then that property would result in a query string value of

....&Subjects=System.Collections.Generic.List'1[System.String]

and binding would fail and that property would be null

Solution 4 - asp.net Mvc

  [HttpPost]
    public async Task<ActionResult> Capture(string imageData)
    {                      
        if (imageData.Length > 0)
        {
            var imageBytes = Convert.FromBase64String(imageData);
            using (var stream = new MemoryStream(imageBytes))
            {
                var result = (JsonResult)await IdentifyFace(stream);
                var serializer = new JavaScriptSerializer();
                var faceRecon = serializer.Deserialize<FaceIdentity>(serializer.Serialize(result.Data));

                if (faceRecon.Success) return RedirectToAction("Index", "Auth", new { param = serializer.Serialize(result.Data) });

            }
        }

        return Json(new { success = false, responseText = "Der opstod en fejl - Intet billede, manglede data." }, JsonRequestBehavior.AllowGet);
        
    }


// GET: Auth
    [HttpGet]
    public ActionResult Index(string param)
    {
        var serializer = new JavaScriptSerializer();
        var faceRecon = serializer.Deserialize<FaceIdentity>(param);


        return View(faceRecon);
    }

Solution 5 - asp.net Mvc

[NonAction]
private ActionResult CRUD(someModel entity)
{
        try
        {
			//you business logic here
     return View(entity);
       }                                
         catch (Exception exp)
         {
             ModelState.AddModelError("", exp.InnerException.Message);
             Response.StatusCode = 350;
             return someerrohandilingactionresult(entity, actionType);
         }
         //Retrun appropriate message or redirect to proper action
      return RedirectToAction("Index");   
}

Solution 6 - asp.net Mvc

i did find something like this, helps get rid of hardcoded tempdata tags

public class AccountController : Controller
{
    [HttpGet]
    public ActionResult Index(IndexPresentationModel model)
    {
        return View(model);
    }

    [HttpPost]
    public ActionResult Save(SaveUpdateModel model)
    {
        // save the information

        var presentationModel = new IndexPresentationModel();

        presentationModel.Message = model.Message;

        return this.RedirectToAction(c => c.Index(presentationModel));
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAmitView Question on Stackoverflow
Solution 1 - asp.net MvcMurali MurugesanView Answer on Stackoverflow
Solution 2 - asp.net MvcVinay Pratap Singh BhadauriaView Answer on Stackoverflow
Solution 3 - asp.net Mvcuser3559349View Answer on Stackoverflow
Solution 4 - asp.net Mvchansen.palleView Answer on Stackoverflow
Solution 5 - asp.net MvcEr. Binod MehtaView Answer on Stackoverflow
Solution 6 - asp.net MvcDiSaSteRView Answer on Stackoverflow