Проверять две модели, только если заполнены какие-либо поля - PullRequest
1 голос
/ 19 марта 2019

У меня есть вид с двумя моделями: общий аккаунт и профиль пользователя.

public class AccountModel
{
    [Display(Name = "UserId", Prompt = "UserId", ResourceType = typeof(Strings))]
    public string UserId { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Validation))]
    [EmailAddress(ErrorMessage = null, ErrorMessageResourceName = "InvalidEmail", ErrorMessageResourceType = typeof(Validation))]
    [Display(Name = "Email", Prompt = "Email", ResourceType = typeof(Strings))]
    public string Email { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Validation))]
    [StringLength(100, ErrorMessageResourceName = "FieldMaximumLength", ErrorMessageResourceType = typeof(Validation))]
    [Display(Name = "DisplayName", Prompt = "DisplayName", ResourceType = typeof(Strings))]
    public string DisplayName { get; set; }

    [Display(Name = "PhoneNumber", Prompt = "PhoneNumber", ResourceType = typeof(Strings))]
    public string PhoneNumber { get; set; }

    [Display(Name = "Country", Prompt = "Country", ResourceType = typeof(Strings))]
    public int CountryId { get; set; }

    public SelectList CountryList { get; set; }

}

public class UserProfileModel
{
    [Display(Name = "ID User", Prompt = "ID User")]
    public string IDUser { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Validation))]
    [StringLength(100, ErrorMessageResourceName = "FieldMaximumLength", ErrorMessageResourceType = typeof(Validation))]
    [Display(Name = "UserFullName", Prompt = "UserFullName")]
    public string UserFullName { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Validation))]
    [StringLength(16, ErrorMessageResourceName = "FieldMaximumLength", ErrorMessageResourceType = typeof(Validation))]
    [Display(Name = "Code", Prompt = "Code")]
    public string Code { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Validation))]
    [StringLength(250, ErrorMessageResourceName = "FieldMaximumLength", ErrorMessageResourceType = typeof(Validation))]
    [Display(Name = "Birth Place", Prompt = "BirthPlace")]
    public string BirthPlace { get; set; }

    [Display(Name = "Newsletter")]
    public bool? Newsletter { get; set; }

    [Display(Name = "Avatar", Prompt = "Avatar")]
    public string Avatar { get; set; }

}

Мне следует проверить вторую модель, только если заполнено хотя бы одно поле, связанное с ним.
Например, если введено BirthPlace, проверьте также вторую модель, в противном случае проверьте только первую модель.
Я надеюсь, что мой запрос ясен

1 Ответ

0 голосов
/ 19 марта 2019

Если я понимаю ваш вопрос, возможно, вы хотите знать, как вручную проверить модель.

Вы можете использовать TryValidateModel(modelInstance); вызов, чтобы вручную подтвердить требуемую модель.

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

например, если все строковые свойства userProfileModelObject имеют значение NULL, тогда проверьте правильность accountModelInstance

bool isSecondObjectValid = userProfileModelObject.GetType().GetProperties()
    .Where(pi => pi.PropertyType == typeof(string))
    .Select(pi => (string)pi.GetValue(myObject))
    .Any(value => string.IsNullOrEmpty(value));


bool validationResult = false;
validationResult = !isSecondObjectValid ? 
                          TryValidateModel(accountModelInstance) :
                          TryValidateModel(userProfileModelObject);

Iнадеюсь это поможет.

Ссылки:

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