Подтвердить модель по первому запросу - PullRequest
0 голосов
/ 06 января 2011

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

Я пытался использовать TryValidateModel (модель), но это не работает, он не обновляет ModelState, я предполагаю, что он будет проверять только то, что заполнено из ModelBinder

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

        [Authorize, HttpGet, ActionName("StepOne")]
    public ActionResult StepOneGET(StepOneModel model)
    {
        var individual = _onsideService.Get(User.Identity.Name);

        model.PersonalInformation = new PersonalInformationModel
                                        {
                                            FirstName = individual.FirstName,
                                            LastName = individual.LastName,
                                            DoB = individual.DateOfBirth.ToString("dd/MM/yyyy"),
                                            Email = individual.DefaultEmail.EmailAddress,
                                            Phone = individual.DefaultPhone.Number,
                                            AddressLine1 = location.Address1,
                                            AddressLine2 = location.Address2,
                                            City = location.City,
                                            PostCode = location.PostalCode,
                                            Country = location.Country
                                        };

        // NOTE: Does not update ModelState
        TryValidateModel(model);

        // Need to return potential errors to user on page load

        return View(model);     
    }

1 Ответ

2 голосов
/ 06 января 2011

Вот фрагмент, предоставленный в другой вопрос здесь, на SO.Я не возьму за это кредит, но он должен делать именно то, что вы хотите.

public static IList<KeyValuePair<string, string>> GetErrors(object obj)
    {
        // get the name of the buddy class for obj
        MetadataTypeAttribute metadataAttrib = obj.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault() as MetadataTypeAttribute;

        // if metadataAttrib is null, then obj doesn't have a buddy class, and in such a case, we'll work with the model class
        Type buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : obj.GetType();

        var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(obj.GetType()).Cast<PropertyDescriptor>();

        var errors = from buddyProp in buddyClassProperties
                           join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name // as this is an inner join, it will return only the properties that are in both the buddy and model classes
                           from attribute in buddyProp.Attributes.OfType<ValidationAttribute>() // get only the attributes of type ValidationAttribute
                           where !attribute.IsValid(modelProp.GetValue(obj))
                           select new KeyValuePair<string, string>(buddyProp.Name, attribute.FormatErrorMessage(string.Empty));

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