Мастер Asp.net mvc - нужно руководство

Мне нужна помощь в создании мастера в 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");
    }
}

Спасибо!


person zSynopsis    schedule 31.08.2011    source источник


Ответы (2)


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

person Darin Dimitrov    schedule 31.08.2011

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

person JP.    schedule 01.09.2011