Возврат Просмотр с данными формы - PullRequest
0 голосов
/ 09 августа 2011

У меня есть контроллер ниже. Я возвращаю представление, если происходит ошибка, но данные формы теряются. Кто-нибудь есть идеи, как я могу вернуть данные формы с представлением?

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Register(FormCollection collection)
    {
        string usrname = collection["UserName"];
        string email = collection["Email"];
        string password = collection["Password"];
        string serial = collection["Serial"];
        ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
        // In a real app, actually register the user now
        if (ValidateRegistration(usrname, email, password, password))
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus = MembershipService.CreateUser(usrname, password, email, serial);

            if (createStatus == MembershipCreateStatus.Success)
            {
                //TODO userinformation

                datacontext.SaveChanges();
                FormsAuth.SignIn(collection["UserName"], false /* createPersistentCookie */);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));

                //I would like to return the view with the form data

                return View();
            }
        }

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

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

public class RegisterUserViewModel
{
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Serial { get; set; }
    public int PasswordLength { get; set; }
}

и затем:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(RegisterUserViewModel model)
{
    model.PasswordLength = MembershipService.MinPasswordLength;
    // In a real app, actually register the user now
    if (ValidateRegistration(model.UserName, model.Email, model.Password, model.Password))
    {
        // Attempt to register the user
        MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email, model.Serial);
        if (createStatus == MembershipCreateStatus.Success)
        {
            //TODO userinformation
            datacontext.SaveChanges();
            FormsAuth.SignIn(model.UserName, false /* createPersistentCookie */);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));
            return View(model);
        }
    }

    ...
}

Мастер приложений ASP.NET MVC 3 по умолчанию в Visual Studio создает пример того, как сделать это в AccountController.

0 голосов
/ 09 августа 2011

Прежде всего, я бы рекомендовал использовать шаблон PRG (не возвращать представление из нашего действия POST)

Вам нужно будет хранить ModelState во временных данных, но вы можете легко сделать это с помощью атрибутов фильтра действий - см. пункт 13. в этом блоге .

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