I have a problem which I cant figure out how to fix. please note I'm very new to MVC.
Im designing a survey which has 8 questions. Im creating each question in a view.
What I need to is to keep the data between my views, but I lose the data even though I passed them through as a single view model.
Please help....
I have the following ViewModel
public class SurveyViewModelNew
{
public string description { get; set; }
public Question1ViewModel QuestionText1 { get; set; }
public Question2ViewModel QuestionText2 { get; set; }
public Question3ViewModel QuestionText3 { get; set; }
public Question4ViewModel QuestionText4 { get; set; }
public Question5ViewModel QuestionText5 { get; set; }
public Question6ViewModel QuestionText6 { get; set; }
public Question7ViewModel QuestionText7 { get; set; }
public Question8ViewModel QuestionText8 { get; set; }
}
And a view Model for each question:
public class Question1ViewModel
{
public string QuestionText { get; set; }
public AnswerViewModel Answers { get; set; }
}
and I here is how my view look like ?
@model survey.Models.SurveyViewModelNew
@using (Html.BeginForm("QuestionOneNext", "CreateSurveyStep2", FormMethod.Post, new { @class = "form-horizontal", role = "form", Model = Model }))
{
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.Label("Question 1: What question would you like to ask", htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-5">
@Html.EditorFor(model => model.QuestionText1.QuestionText, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.QuestionText, "", new { @class = "text-danger" })
</div>
</div>
<br/>
<br/>
<div class="form-group">
@Html.Label("Answer A", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextA, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextA, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer B", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextB, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextB, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer C", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextC, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextC, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer D", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextD, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextD, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer E", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextE, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextE, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer F", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextF, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextF, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer G", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextG, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextG, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer H", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.QuestionText1.Answers.AnswerTextH, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.QuestionText1.Answers.AnswerTextH, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer K", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.Label("Not applicable", htmlAttributes: new { @class = "control-label col-md-2" })
</div>
</div>
<div class="form-group">
@Html.Label("Answer L", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.Label("Flag inappropriate question/refuse to answer", htmlAttributes: new { @class = "control-label col-md-5" })
</div>
</div>
<br/>
<br/>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Previous Step" class="btn btn-info" name="direction"/>
<input type="submit" value="Add a New Question to this survey" class="btn btn-danger" name="direction" />
<input type="submit" value="Countinue to submit this survey" class="btn btn-success" name="direction" />
</div>
</div>
</div>
}
and here is how my controller look like:
[HttpPost]
public ActionResult QuestionOneNext(SurveyViewModelNew surveyViewModel, string direction)
{
if (direction == "Countinue to submit this survey")
return RedirectToAction("Edit", "something", surveyViewModel);
if (direction == "Add a New Question to this survey")
{
return View("QuestionTwo", surveyViewModel);
//return RedirectToAction("QuestionTwo", "CreateSurveyStep2", surveyViewModel);
}
if (direction == "Previous Step")
return RedirectToAction("Index", "CreateSurveyStep1", surveyViewModel);
return View();
}
[HttpPost]
public ActionResult QuestionTwo(SurveyViewModelNew surveyViewModel, string direction)
{
if (direction == "Countinue to submit this survey")
{
return RedirectToAction("Edit", "NutStorage", surveyViewModel);
}
if (direction == "Add a New Question to this survey")
{
//return RedirectToAction("QuestionThree", "CreateSurveyStep2", surveyViewModel);
return View("QuestionThree", "CreateSurveyStep2", surveyViewModel);
}
if (direction == "Previous Step")
return RedirectToAction("QuestionOne", "CreateSurveyStep2", surveyViewModel);
return View();
}
what happens is when I get to "QuestionTwo" action in my controller I lose the answer to the first question.
I fixed this by using TemData, the following is my fixed controller:
[HttpGet]
public ActionResult QuestionOne(SurveyViewModelNew surveyViewModel)
{
var currentSurveyViewModel = (SurveyViewModelNew)TempData["SurveyView"];
if (currentSurveyViewModel != null)
{
if (currentSurveyViewModel.description != null)
{
surveyViewModel.description = currentSurveyViewModel.description;
}
if (currentSurveyViewModel.QuestionText1 != null)
{
surveyViewModel.QuestionText1 = currentSurveyViewModel.QuestionText1;
}
if (currentSurveyViewModel.QuestionText2 != null)
{
surveyViewModel.QuestionText2 = currentSurveyViewModel.QuestionText2;
}
if (currentSurveyViewModel.QuestionText3 != null)
{
surveyViewModel.QuestionText3 = currentSurveyViewModel.QuestionText3;
}
if (currentSurveyViewModel.QuestionText4 != null)
{
surveyViewModel.QuestionText4 = currentSurveyViewModel.QuestionText4;
}
if (currentSurveyViewModel.QuestionText5 != null)
{
surveyViewModel.QuestionText5 = currentSurveyViewModel.QuestionText5;
}
if (currentSurveyViewModel.QuestionText6 != null)
{
surveyViewModel.QuestionText6 = currentSurveyViewModel.QuestionText6;
}
if (currentSurveyViewModel.QuestionText7 != null)
{
surveyViewModel.QuestionText7 = currentSurveyViewModel.QuestionText7;
}
TempData["SurveyView"] = surveyViewModel;
}
if (surveyViewModel.description!= null)
{
surveyViewModel.description = surveyViewModel.description;
TempData["SurveyView"] = surveyViewModel;
}
return View("QuestionOne", surveyViewModel);
}
[HttpGet]
public ActionResult QuestionOneNext(SurveyViewModelNew surveyViewModel, string direction)
{
var currentSurveyViewModel = (SurveyViewModelNew)TempData["SurveyView"];
if (currentSurveyViewModel != null)
{
if (currentSurveyViewModel.description != null)
{
surveyViewModel.description = currentSurveyViewModel.description;
}
if (currentSurveyViewModel.QuestionText1 != null)
{
surveyViewModel.QuestionText1 = currentSurveyViewModel.QuestionText1;
}
if (currentSurveyViewModel.QuestionText2 != null)
{
surveyViewModel.QuestionText2 = currentSurveyViewModel.QuestionText2;
}
if (currentSurveyViewModel.QuestionText3 != null)
{
surveyViewModel.QuestionText3 = currentSurveyViewModel.QuestionText3;
}
if (currentSurveyViewModel.QuestionText4 != null)
{
surveyViewModel.QuestionText4 = currentSurveyViewModel.QuestionText4;
}
if (currentSurveyViewModel.QuestionText5 != null)
{
surveyViewModel.QuestionText5 = currentSurveyViewModel.QuestionText5;
}
if (currentSurveyViewModel.QuestionText6 != null)
{
surveyViewModel.QuestionText6 = currentSurveyViewModel.QuestionText6;
}
if (currentSurveyViewModel.QuestionText7 != null)
{
surveyViewModel.QuestionText7 = currentSurveyViewModel.QuestionText7;
}
}
if (direction == "Countinue to submit this survey")
return View("something", surveyViewModel);
else if (direction == "Add a New Question to this survey")
{
TempData["SurveyView"] = surveyViewModel;
return View("QuestionTwo", surveyViewModel);
}
else if (direction == "Previous Step")
{
TempData["SurveyView"] = surveyViewModel;
return View("Index", surveyViewModel);
}
else return View();
}