Попробуйте VALIDATE и вручную установить значения в Cotroller (ASP MVC 3) - PullRequest
0 голосов
/ 04 октября 2011

У меня есть форма «Новый пользователь» как для администраторов, так и для обычных пользователей.В обеих формах используется RegisterModel

public class RegisterModel
{
    [Required]
    public string Name { get; set; }

    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

Разница в том, что на моей странице "Новый пользователь" я хочу, чтобы пользователи вводили свой пароль.Но в бэкэнде я хочу, чтобы система сгенерировала пароль.

Поскольку я использую один и тот же RegisterModel для обеих форм, я получаю ошибку проверки в бэкэнде, говорящую Password is required..

Я думал, я мог бы решить эту проблему, добавив в свой контроллер следующее:

    [HttpPost]
    public ActionResult New(RegisterModel model)
    {
        model.Password = Membership.GeneratePassword(6, 1);

        if (TryValidateModel(model))
        {
            // Do stuff
        }

        return View(model);
    }

Но я все еще получаю сообщение об ошибке Password is required..Почему эта проблема возникает, когда я вызываю TryValidate в моем контроллере?

Что было бы лучшим решением для этой проблемы, создайте отдельный RegisterModelBackEnd или есть какие-то другие решения для этого?

1 Ответ

1 голос
/ 04 октября 2011

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

protected internal bool TryUpdateModel<TModel>(
    TModel model,
    string[] includeProperties
)
where TModel : class

Таким образом, рабочий код будет

[HttpPost]
public ActionResult New()
{
    RegisterModel model = new RegisterModel();
    model.Password = Membership.GeneratePassword(6, 1);

    if (TryValidateModel(model, new string[] {"Name", "Email"}))
    {
        // Do stuff
    }

    return View(model);
}

Вы можете сделать это еще проще, используя BindAttribute

[HttpPost]
public ActionResult New([Bind(Exlude="Password")]RegisterModel model)
{
    if(ModelState.IsValid)
    {
       model.Password = Membership.GeneratePassword(6, 1);
       // Do Stuff
    }

    return View(model);
}

И, наконец, самый простой и лучший способ

Определение моделей отдельных видов

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