Шаблон состояния в ASP.NET MVC 3.0 - PullRequest
8 голосов
/ 05 октября 2011

У меня есть страница регистрации в моей заявке. Имеет 3 состояния и 1 состояние ошибки (если возникает какая-либо ошибка):

  1. Заполнить базовую информацию
  2. Выберите пакет
  3. Скажи спасибо
  4. Error

Теперь я хочу использовать здесь шаблон состояния. Сначала я создал консольное приложение, которое в порядке. Теперь я хочу реализовать эту логику в своем приложении MVC, но я не понимаю структуру. Я имею в виду, сколько видов, моделей и контроллеров мне нужно и где разместить свою логику.

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

1 контроллер : RegistrationController

6 методов действия :

  • GET + POST для индекса (заполните основную информацию)
  • GET + POST для пакета
  • GET для спасибо
  • GET для ошибки

Это грубый код, который заставит вас задуматься:

public class RegistrationController : Controller
{
    public ActionResult Index()
    {
        RegistrationState model = RegistrationState.Init();
        // just display the "Fill Basic Info" form
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(RegistrationState data)
    {
        // process data and redirect to next step
        this.TempData["RegState"] = data;
        if (!this.ModelState.IsValid || data.State == State.Error)
        {
            // error should handle provided state and empty one as well
            return RedirectToAction("Error");
        }
        return RedirectToAction("Package");
    }

    public ActionResult Package()
    {
        RegistrationState data = this.TempData["RegState"] as RegistrationState;
        if (data == null)
        {
            return RedirectToAction("Error");
        }

        // get packages and display them
        IList<Package> model = this.repository.GetPackages();
        return View(new Tuple.Create(data, model));
    }

    [HttpPost]
    public ActionResult Package(RegistrationState data)
    {
        // process data blah blah blah
    }

    // and so on and so forth
    ....
}

Как вы видите, вам все еще нужно написать некоторый код, связанный с MVC, чтобы действовать при изменении состояния.В моем примере все сделано в методах действия.Но фильтры действия также могут быть использованы.Если вы не можете придумать фильтр общего действия, который может обслуживать множество различных объектов состояния, то лучше просто написать код в методах действия.

Другой подход

Если вы знаете Asp.net MVC достаточно хорош, чтобы вы могли пойти дальше и написать конечный автомат ControllerFactory, который будет работать вместе с маршрутизацией в следующем смысле:

{StateObjectType}/{State}

ControllerFactory сможет анализировать данные представления в известном состоянии.тип объекта и передача выполнения к определенному действию.По гос.Это сделало бы его специальным конечным автоматом, подходящим для приложения MVC Asp.net.

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

Важные замечания

  1. Вы должны быть очень осторожны при определении состояния ошибки, поскольку вводите недопустимое поледанные не должны приводить к состоянию ошибки, а скорее к ошибкам проверки данных, которые фактически отображаются в представлении рядом с полем с недопустимыми данными (то есть недопустимая дата, указанная как 13/13/1313)Ваше состояние ошибки должно использоваться только для фактической ошибки состояния объекта, которая не связана с пользовательским вводом.Что бы это могло быть за пределами моего воображения.

    Как уже упоминалось в моем комментарии, вы должны посмотреть некоторые вступительные видеоролики Asp.net MVC, и вы увидите, как проверка работает в Asp.net MVC.Также довольно простые вещи.

  2. Шаблон состояний такого рода не является чем-то, что обычный разработчик Asp.net MVC использовал бы, потому что он, скорее всего, усложнил бы код больше, чем принятие нормального подход.Проанализируйте, прежде чем решить.Asp.net MVC очень чистый код, поэтому добавление к нему дополнительной абстракции может привести к путанице.И ваша доменная модель (классы состояний), скорее всего, будет иметь гораздо более сложный код, чем простые POCO с аннотациями данных.

    В вашем случае проверка данных также будет более сложной (при использовании с аннотациями данных), поскольку вы возражаетедолжны быть проверены в соответствии с его состоянием, которое может быть различным в разных штатах.Объекты POCO всегда проверяются одинаково.Это может означать, что мы можем использовать больше классов, но они меньше, проще и проще в обслуживании.

0 голосов
/ 05 октября 2011

Я думаю, что вы в замешательстве. Примеры состояния:

  1. В ожидании регистрации пользователя
  2. Пользователь успешно зарегистрирован
  3. Пользователь не зарегистрировался успешно

Теперь у каждого из этих состояний есть страница:

  1. локальный: 8034 / Регистрация
  2. локальный: 8034 / Регистрация / Success
  3. локальный: 8034 / Регистрация / Failure

Если пользователь не может зарегистрироваться, потому что он оставил некоторые поля пустыми, они будут в первом состоянии, и вам придется отображать некоторые сообщения проверки.

Из-за этого, как минимум, у меня будет контроллер с именем Register и следующие методы действий:

  1. Индекс () GET / POST
  2. Success () GET
  3. Failure () GET
...