Игнорировать обязательный атрибут при сохранении на странице редактирования - PullRequest
7 голосов
/ 05 мая 2011

У меня есть класс модели, у которого есть пара обязательных полей:

public class UserMetadata
{
   [Required(ErrorMessage = "Please enter a name.")]
   public string Name { get; set; }

   [Required(ErrorMessage = "Please enter a password.")]
   public string Password { get; set; }
}

В представлении создания, если я не даю имя и / или пароль, появляются ошибки сводки проверки.Все хорошо и хорошо.Для представления редактирования я только отображаю поле «Имя» - я не отображаю поле «Пароль».

Когда я сохраняю свои изменения на странице редактирования, появляется ошибка сводки проверки, говорящаячто я должен ввести пароль.

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

РЕДАКТИРОВАТЬ:

Для моего проекта MVC я использую Entity Framework.Таким образом, у меня определен класс «UserMetadata», так что я могу прикрепить такие вещи, как «[Обязательный]», к определенным полям класса «Пользователь» (который находится в файле EDMX).

Я должен также объяснитьчто я использую модель представления, например 'UserEditViewModel', к которой прикреплено свойство 'User'.Итак, на моем посту:

[HttpPost]
public ActionResult Edit(UserEditViewModel inputViewModel)
{

    if(ModelState.IsValid) { inputViewModel.User blah.... }

}

Думаю, я немного поторопился при наборе этого вопроса.Любая другая недостающая информация, которую вы считаете важной, пожалуйста, напишите мне.

Приветствия.Иак.

Ответы [ 3 ]

11 голосов
/ 06 мая 2011

Я закончил делать это в моем методе действия:

ModelState.Remove("User.Password");

Теперь мой код работает нормально, вызывая только ошибки проверки в поле «Имя», что я и хотел ..

4 голосов
/ 14 августа 2014

ModelState.Remove("User.Password") у меня не работал в MVC 3.

Однако сработало следующее.

Вариант 1:

ModelState.Remove("Password")

Вариант 2:

ModelState.Where(m => m.Key == "Password").FirstOrDefault().Value.Errors.Clear()
0 голосов
/ 05 мая 2011

Предполагая, что вы используете свой класс UserMetadata в качестве модели представления, вы должны использовать другую модель представления для каждой страницы (представление).

, например

public class UserMetaDataCreate
{
    [Required(ErrorMessage = "Please enter a name.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a password.")]
    public string Password { get; set; }
}

и UserMetaDataEdit

public class UserMetaDataEdit
{
    [Required(ErrorMessage = "Please enter a name.")]
    public string Name { get; set; }
}

Как правило, если для представления редактирования не требуется пароль, его все равно не должно быть в модели.

В вашем контроллере,

public ActionResult Create()
{
    return View(new UserMetaDataCreate());
}
// and subsequent post actions
[HttpPost]
public ActionResult Edit(UserMetaDataEdit vm)
{
    if(ModelState.IsValid)
    {
        // do something
    }
    else
        return View(vm);
}

Конечно, вы можете заняться наследованием, поскольку ваши модели становятся более сложными, например,

public class UserMetaData
{
    [Required(ErrorMessage = "Please enter a name.")]
    public string Name { get; set; }
}

И подкласс вашего вида моделей

public class UserMetaDataEdit
{
    [Required(ErrorMessage = "Please enter a password.")]
    public string Password { get; set; }
}

public class UserMetaDataCreate
{

}

Но я не уверен, что это имеет смысл в контексте, так как UserMetaData семантически включает пароль.

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