ASP.Net MVC3 условной проверки - PullRequest
0 голосов
/ 11 мая 2011

У меня проблемы с проверкой моего приложения. Допустим, у меня есть следующие модели:

    public class Company
    {
        public int id { get; set; }
        [Required]
        public String Name { get; set; }
        public String Location { get; set; }
        public List<Contacts> Contacts { get; set; }
    }

    public class Contact
    {
        public int id { get; set; }
        [Required]
        public String Name { get; set; }
        [DataType(DataType.EmailAddress)]
        public String Email { get; set; }
        public String Telephone { get; set; }
        public String Mobile { get; set; }
    }

Теперь в моем представлении создания компании есть две кнопки: одна для добавления контактов в компанию, а другая для создания новой компании. Я обнаружил, какая кнопка использовалась в моем контроллере следующим образом (обе кнопки называются «кнопками»):

    [HttpPost]
    public ActionResult Create(String button, FormCollection collection)
    {
        if(button == "AddContact")
        {
            AddContact(collection);
        }
        else
        {
            CreateCompany(collection);
        }
    }

Во время создания объект, представляющий компанию, которую он создает, сохраняется в сеансе (например, HttpContext.Session ["company"] = company;)

Теперь проблема в том, что если, например, я пытаюсь добавить контакт без предварительного указания названия компании, я получаю ошибку проверки, потому что требуется название компании, что не должно произойти, потому что пользователь может захотеть добавить контакты перед добавлением информации о компании. Или, если я пытаюсь сохранить компанию, я также получаю ошибку проверки, потому что обычно при сохранении форма «добавить контакт» пуста, что означает, что имя контакта (которое также необходимо) не было указано.

Что я хочу знать, так это то, что если возможно проверить свойства контакта только при использовании кнопки addContact, и проверить свойства компании только при нажатии кнопки createCompany.

На данный момент мне нужно только сделать это на стороне обслуживания, но если у кого-то есть решение сделать это на стороне клиента, я был бы признателен за помощь.

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Вы можете обеспечить условную проверку, используя Entity Framework, переопределив DbEntityValidationResult в DbContext. Когда эта проверка происходит в DbContext, вы можете получить доступ к другим объектам. При проверке контакта вы также можете проверить компанию. Например:

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        var result = base.ValidateEntity(entityEntry, items);
        ValidateContact(result);
        return result;
    }

    private void ValidateContact(DbEntityValidationResult result)
    {
        var contact= result.Entry.Entity as Contact;
        if (contact!= null && contact.ContactId != 0)
        { 
            // Add validation code here, such as:
            if(!string.IsNullOrEmpty(contact.Company.Name){ 
                     result.ValidationErrors.Add(
                     new DbValidationError(
                       "Contact",
                       "Company name cannot be null or empty when validating contacts.")
                     );
            }
        }
    }

Для получения более подробной информации см. Структура программирования Джулии Лерман: DbContext http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969.

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

Вы можете запустить свою собственную проверку для отдельных объектов, используя Validator.TryValidateObject (Object, ValidationContext, ICollection)

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