I am in the process of creating a data driven multi step form, which returns the same view(template) each time the "Next/Previous" buttons are clicked.
However, when clicking "Next" (submit) I get the following:
Here is the main view (template) that will always be returned each time "next/previous" is clicked. (see below)
public class SchemeWizardStepsViewModel : PublishedContentWrapped
{
public SchemeWizardStepsViewModel(IPublishedContent content) : base(content) { }
public Scheme Scheme { get; set; }
public int NumberOfWizardSteps { get; set; }
public int CurrentWizardStep { get; set; }
public List<WizardStepViewModel> Steps { get; set; }
public void PersistAnswers(int currentWizardStep, WizardStepViewModel currentWizardStepViewModel)
{
for (int i = 0; i < Steps.Count; i++)
{
if (Steps[i].WizardStep == currentWizardStep)
{
List<QuestionViewModel> questions = Steps[i].Questions;
for (int j = 0; j < questions.Count; j++)
{
//check for nulls
if (questions[j] != null)
{
var answer = currentWizardStepViewModel.Questions.FirstOrDefault(f => f.Question.ID == questions[j].Question.ID).Answer;
if (answer != null)
{
questions[j].Answer.AnswerValue = answer.AnswerValue;
}
}
}
}
}
}
}
Here is my Controller
namespace QuoteBeater.Controllers
{
public class QuoteFormController : RenderMvcController
{
public static LogicInstance instance = _Code.SiteSingleton.LogicInstance_ServiceSingleton.Instance;
public static TeledynamicsWebsiteContext context = instance.GetWebsiteContext(ConfigurationManager.ConnectionStrings["teledynamicsWebsiteDBContext"].ToString());
public static ContentModel contentModel { get; set; }
public QuoteFormController() { }
public override ActionResult Index(ContentModel model)
{
contentModel = model;
string schemeType = "Private";
ModelState.Clear();
Scheme scheme = context.Schemes_GetAll().FirstOrDefault(x => x.SchemeName.ToLower().Contains(schemeType.ToLower()));
List<SchemeGroup> schemeGroups = context.Schemes_GetSchemeGroups(scheme.ID);
List<Question> schemeQuestions = context.Schemes_GetSchemeQuestions(scheme.ID);
foreach (var item in schemeGroups.OrderBy(o => o.Group.ID))
{
List<QuestionViewModel> questionViewModels = new List<QuestionViewModel>();
List<Question> groupQuestions = schemeQuestions.Where(f => f.Group.ID == item.Group.ID).ToList();
for (int i = 0; i < groupQuestions.Count; i++)
{
questionViewModels.Add(new QuestionViewModel(contentModel.Content) { Question = groupQuestions[i], Answer = new AnswerViewModel(contentModel.Content) { QuestionID = groupQuestions[i].ID } });
}
WizardStepViewModel wizardStepViewModel = new WizardStepViewModel(contentModel.Content)
{
GroupId = item.Group.ID,
GroupName = item.Group.GroupName,
Questions = questionViewModels,
WizardStep = wizardStep,
FinalWizardStep = schemeGroups.Count
};
foreach (var questionViewModel in wizardStepViewModel.Questions)
{
}
schemeSteps.Add(wizardStepViewModel);
wizardStep++;
}
schemeWizardStepsViewModel.Scheme = scheme;
schemeWizardStepsViewModel.CurrentWizardStep = 1;
schemeWizardStepsViewModel.Steps = schemeSteps;
//Persist data here...
Session["CurrentWizardStep"] = schemeWizardStepsViewModel.CurrentWizardStep;
Session["SchemeWizardStepViewModel"] = schemeWizardStepsViewModel;
return View("~/Views/quoteForm.cshtml", schemeWizardStepsViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult HandleWizardStepAction(WizardStepViewModel wizardStepViewModel, string submitButton)
{
//http://www.binaryintellect.net/articles/c69d78a3-21d7-416b-9d10-6b812a862778.aspx
//https://stackoverflow.com/questions/442704/how-do-you-handle-multiple-submit-buttons-in-asp-net-mvc-framework
switch (submitButton)
{
case "Next":
return (MoveToNextWizardStep(wizardStepViewModel));
case "Previous":
return (MoveToPreviousWizardStep(wizardStepViewModel));
case "Finish":
return (FinishWizard(wizardStepViewModel));
default:
// If they've submitted the form without a submitButton,
// just return the view again.
return (View());
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MoveToNextWizardStep(WizardStepViewModel wizardStepViewModel)
{
SchemeWizardStepsViewModel schemeWizardStepsViewModel = (SchemeWizardStepsViewModel)Session["SchemeWizardStepViewModel"];
return View("~/Views/quoteForm.cshtml", schemeWizardStepsViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MoveToPreviousWizardStep(WizardStepViewModel wizardStepViewModel)
{
ModelState.Clear();
SchemeWizardStepsViewModel schemeWizardStepsViewModel = (SchemeWizardStepsViewModel)Session["SchemeWizardStepViewModel"];
return View("~/Views/quoteForm.cshtml", schemeWizardStepsViewModel);
}
[HttpPost]
public ActionResult FinishWizard(WizardStepViewModel wizardStepViewModel)
{
return View("~/Views/quoteForm.cshtml");
}
}
}
I am not inheriting from "surfacecontroller" and instead using "rendermvccontroller" due to if i used surface, I always faced errors about not being able to bind the models builder model to my custom model.
Form Submission Error
I am in the process of creating a data driven multi step form, which returns the same view(template) each time the "Next/Previous" buttons are clicked.
However, when clicking "Next" (submit) I get the following:
Here is the main view (template) that will always be returned each time "next/previous" is clicked. (see below)
Here is the view with "beginUmbracoForm" and the questions (used with Html.EditorFor)
Here is my model
Here is my Controller
I am not inheriting from "surfacecontroller" and instead using "rendermvccontroller" due to if i used surface, I always faced errors about not being able to bind the models builder model to my custom model.
Can anyone suggest where I am going wrong?
is working on a reply...
This forum is in read-only mode while we transition to the new forum.
You can continue this topic on the new forum by tapping the "Continue discussion" link below.