Asp.net MvC Wizard - нужно руководство - PullRequest
1 голос
/ 01 сентября 2011

Мне нужна помощь в создании мастера в asp.net mvc. Этот мастер будет содержать около 7 или 8 шагов. Вот как я смоделировал контроллер, и я надеялся получить некоторую обратную связь о том, является ли это правильным подходом или посмотреть, есть ли лучшие способы, которые кто-то здесь может порекомендовать.

  • Я создал отдельный класс модели представления для каждого из шагов.
  • У меня есть класс Wizard, который содержит каждую из этих отдельных моделей + свойства, такие как CurrentStep и т. Д.
  • Я создал отдельное представление для каждого из шагов.

Мой контроллер выглядит так

public class MyRegistrationController
{
    [HttpGet]
    public ActionResult Step1()
    {
        var wizard = TempData[WizardKey] as RegistrationWizard;
        RegistrarRegisterVoterNewRegistrant model;

        if (wizard == null || wizard.Step1Model == null)
        {
            wizard = new RegistrationWizard();
            model = new NewRegistrant();
        }
        else
            model = wizard.Step1Model;

        wizard.CurrentStep = 1;
        wizard.Step1Model = model;

        TempData[WizardKey] = wizard;

        return View("Step1", model);
    }


    [HttpPost]
    public ActionResult Step1(NewRegistrant model)
    {
        var wizard = TempData[WizardKey] as RegistrationWizard;
        if (wizard == null)
            wizard = new RegistrationWizard();

        if (!ModelState.IsValid)
            return View("Step1", model);



        wizard.Step1Model = model;
        wizard.MaxCompletedStep = 1;

        TempData[WizardKey] = wizard;

        return RedirectToAction("Step2");
    }


    [HttpGet]
    public ActionResult Step2()
    {
        var wizard = TempData[WizardKey] as RegistrationWizard;
        PersonalInformation model;

        if (wizard == null || wizard.Step1Model == null)
            return RedirectToAction("Step1");

        if (wizard.Step2Model == null)
            model = new PersonalInformation ();
        else
            model = wizard.Step2Model;

        wizard.CurrentStep = 2;
        TempData[WizardKey] = wizard;

        return View("Step2", model);
    }


    [HttpPost]
    public ActionResult Step2(PersonalInformation model)
    {

        var wizard = TempData[WizardKey] as RegistrationWizard;
        if (wizard == null || wizard.CurrentStep != 2 || wizard.Step1Model == null)
            return RedirectToAction("Step1");


        if (!ModelState.IsValid)
            return View("Step2", model);


        wizard.Step2Model = model;
        wizard.MaxCompletedStep = 2;

        TempData[WizardKey] = wizard;

        return RedirectToAction("Step3");
    }
}

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

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

1 голос
/ 01 сентября 2011

Я не продаю это как лучший подход, потому что он полностью зависит от ваших потребностей, но зависит от сложности мастера и вашей необходимости сохранять в БД на каждом шаге, который вы можете использоватьчто-то вроде этого jquery Плагин Form to Wizard , чтобы превратить вашу форму в мастера.Это довольно просто и может уменьшить код / ​​сложность в вашем контроллере

...