Действие вызывается как из того же, так и из другого контроллера через RedirectToAction () - PullRequest
0 голосов
/ 27 февраля 2019

Я интегрирую платформу онлайн-платежей в существующую платформу электронной коммерции.Это платформа B2B, и клиенты могут вносить предоплату (используя вышеупомянутую платформу для онлайн-платежей) или размещать свои заказы и выставлять счета в конце месяца.

Следующее действие находится вOrdersController и содержит логику, которая активируется, когда клиент хочет подтвердить свой заказ:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Resume(ResumeViewModel viewModel)
{
    if (!_orderService.CanConfirmOrder(UserId, viewModel.TemporaryOrderId))
    {
        return Resume(viewModel.TemporaryOrderId, _settingsRepository.OrderTooLateMessage());
    }

    if (_customerService.MustPayDirectly(PaniproId))
    {
        return RedirectToAction("Initialize", "Payments", new { orderId = viewModel.TemporaryOrderId, amount = viewModel.OrderViewModel.Total });
    }

    return RedirectToAction("Confirm", new { id = viewModel.TemporaryOrderId });
}

PaymentsController отвечает за перенаправление на действие Confirm, если платеж был успешным наПлатформа удаленного платежа:

public ActionResult Finalize(int orderId)
{
    var finalizeResult = _saferpay.FinalizeTransaction((string)_tokens[orderId.ToString()]);
    if (finalizeResult.IsSuccess)
    {
        return RedirectToAction("Confirm", "Orders", new { id = orderId });
    }
    else
    {
        LogTools.AddLog(finalizeResult.Error.ToString());
        return RedirectToAction("Resume", "Orders", new { id = orderId, errorMessage = finalizeResult.Error.Description });
    }
}

Таким образом, в конечном итоге оба «потока» заканчиваются действием, приведенным ниже, которое окончательно подтверждает заказ и перенаправляет его на подтверждение:

public ActionResult Confirm(int id)
{
    return HandleResult(_orderService.ConfirmOrder(UserId, id), order => RedirectToAction("Confirmation", new { id = order.ID }));
}

Я беспокоюсь овышеуказанное действие имеет два аспекта:

  • Я изменяю состояние в действии GET, которое должно быть операцией без состояния
  • Ручной вызов URL / Orders / Confirm / {id} будет пропускать платежи это тоже очень плохо для бизнеса

В идеале я хотел бы сделать что-то вроде добавления атрибутов [HttpPost] и [ValidateAntiForgeryToken] кего действия, но тогда становится невозможным сделать редирект на него.Как я могу решить эту проблему ?Мой дизайн имеет недостатки и нуждается в рефакторе?

1 Ответ

0 голосов
/ 27 февраля 2019

Я предлагаю перенести актуальную задачу подтверждения заказа за пределы действия «подтвердить».Это действие должно просто отображать некоторый пользовательский интерфейс в ответ на успешное подтверждение.

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

И таким образом, если кто-то решит посетить URL «подтверждения» вручнуютогда он просто покажет им неправильное сообщение, но на самом деле не сделает ничего вредного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...