Я не думаю, что вы нарушаете какие-либо лучшие практики. Сделай шаг назад и подумай, что ты хочешь сделать. Вы хотите, чтобы пользователь с открытым приглашением мог зарегистрироваться.
Пользователь, публикующий регистрацию, должен предоставить свой invidID. Таким образом, действие «Регистрация» должно быть передано по приглашениям. У вас есть это.
Если вы ожидаете, что ваши пользователи будут использовать браузер в качестве своего клиента для регистрации - им нужно будет предоставить форму, позволяющую им зарегистрироваться. Вы, вероятно, не хотите, чтобы они вводили свои идентификаторы приглашения - так что это должно быть заполнено для них. Таким образом, вашему представлению реестра должен быть предоставлен атрибут invid для свойства render формы. У вас есть это.
Единственное, что я могу предложить, это пропустить весь процесс приглашения. Это не очень нужно. Вместо этого просто выполните проверку ошибок в действии Register.
Хорошо, когда вы перенаправляете необходимые данные маршрута. Если вы не можете определить маршрут без каких-либо данных, то как еще вы это сделаете? В этом случае маршрут зависит от атрибута приглашения (так как он необходим для визуализации формы). Передайте это и будьте счастливы:)
Итак, в заключение. То, что вы делаете, не так запутанно. Думайте о каждом шаге, как будто вы ничего не знали о других. Кроме того, я бы рекомендовал пользователям получить HTTP-маршрут, который выглядит следующим образом:
site.com/Account/Register/invitationGUID
или
site.com/Account/Register?invite=invitationGUID
Выбор между вышеизложенным зависит от того, хотите ли вы явно указать идентификатор приглашения в подписи действия (и требовать его для разрешения маршрута), или же вы хотите посмотреть QueryString из действия. Я мог бы склониться к строке запроса в этом вопросе, так как приглашение - это не изменяемая здесь сущность, а шлюз, позволяющий создать сущность пользователя. Пользователи, не имеющие приглашения, вероятно, тоже должны оказаться на этом действии.