Передача данных из контроллера в представление и обратно в контроллер - PullRequest
3 голосов
/ 23 июня 2009

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

Пользователь вызывает URL для приглашения

site.com / счета / Приглашение / invitationGUID

public ActionResult Invitation(Guid invitationGUID)
{
    //Check for the existence of the invitation id
    if(true)
        return RedirectToAction("Account","Register")
    return View("InvalidInvite");
}

Мне нужно передать приглашение GUID в действие Register

public ActionResult Register()
{
    //this is the registration form
    return View();
}

А мне еще нужно приглашение GUID на почту, чтобы сохранить эту информацию

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(string email, string password, string confirmPassword,
                                 string firstName, string lastName, string cep)
{
    //register user
    return View();
}

Что мне делать, чтобы передать эту информацию?
Я попытался передать данные из Приглашения -> Регистрация

return RedirectToAction("Account","Register",invitationGUID)

Вызов представления реестра с приглашением GUID

return View("Register",invitationGUID);

и использование скрытого ввода в окне регистрации, чтобы вернуть его к регистрации с помощью POST

<%= Html.Hidden("invitationGUID",(Guid)Model %>

На мой вкус это слишком переплетается, и я, вероятно, нарушаю множество хороших практик в отношении изоляции вида / контроллера. Должен ли я просто повторить регистрационный код в приглашении?
Я сейчас пытаюсь просто скопировать действие Register POST в приглашении POST.
Есть идеи, что я должен делать по-другому?

Ответы [ 3 ]

1 голос
/ 23 июня 2009

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

Пользователь, публикующий регистрацию, должен предоставить свой invidID. Таким образом, действие «Регистрация» должно быть передано по приглашениям. У вас есть это.

Если вы ожидаете, что ваши пользователи будут использовать браузер в качестве своего клиента для регистрации - им нужно будет предоставить форму, позволяющую им зарегистрироваться. Вы, вероятно, не хотите, чтобы они вводили свои идентификаторы приглашения - так что это должно быть заполнено для них. Таким образом, вашему представлению реестра должен быть предоставлен атрибут invid для свойства render формы. У вас есть это.

Единственное, что я могу предложить, это пропустить весь процесс приглашения. Это не очень нужно. Вместо этого просто выполните проверку ошибок в действии Register.

Хорошо, когда вы перенаправляете необходимые данные маршрута. Если вы не можете определить маршрут без каких-либо данных, то как еще вы это сделаете? В этом случае маршрут зависит от атрибута приглашения (так как он необходим для визуализации формы). Передайте это и будьте счастливы:)

Итак, в заключение. То, что вы делаете, не так запутанно. Думайте о каждом шаге, как будто вы ничего не знали о других. Кроме того, я бы рекомендовал пользователям получить HTTP-маршрут, который выглядит следующим образом:

site.com/Account/Register/invitationGUID

или

site.com/Account/Register?invite=invitationGUID

Выбор между вышеизложенным зависит от того, хотите ли вы явно указать идентификатор приглашения в подписи действия (и требовать его для разрешения маршрута), или же вы хотите посмотреть QueryString из действия. Я мог бы склониться к строке запроса в этом вопросе, так как приглашение - это не изменяемая здесь сущность, а шлюз, позволяющий создать сущность пользователя. Пользователи, не имеющие приглашения, вероятно, тоже должны оказаться на этом действии.

1 голос
/ 23 июня 2009
return RedirectToAction("Account", "Register", new { invitation = invitationGUID });

приглашениеGUID будет частью строки запроса:

public ActionResult Register(Guid invitation)
{
    //this is the registration form
    return View();
}

Используйте Html.BeginForm (), и он будет опубликован для себя:

<% using (Html.BeginForm()) { %>
...
<% } %>

приглашениеGUID все еще находится в строке запроса:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(string email, string password, string confirmPassword,
    string firstName, string lastName, string cep, Guid invitation)
{
    //register user
    return View();
}
0 голосов
/ 23 июня 2009

Если вам не нужны идентификаторы приглашений в строке запроса, вы можете использовать TempData. Здесь - это хорошая статья. Это в основном одноразовый механизм сессии.

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