Обязательно, если проверка с дочерними сущностями - PullRequest
1 голос
/ 19 мая 2011

Я пытаюсь заставить мое приложение MVC3 отображать сообщения проверки RequiredIfs, используя атрибут отсюда: http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx Теперь он работает нормально, если нет дочерних объектов, но у меня есть пользователь, и этот адрес пользователя должен быть проверен. Ну, на самом деле даже один адрес будет работать, но есть 3 адреса, у каждого есть флажок, который указывает, активен он или нет.

Я попытался изменить jQuery для validator.unobtrustive.js следующим образом, чтобы получить правильное значение при проверке (адрес это либо 'Address_', либо 'BillingAddress _':

$.each(this.params, function () {
                    var address = element.name.split('.')[0] + '_';
                    paramValues[this] = this.toString() == 'dependentproperty' ? address + $element.attr(prefix + this) : $element.attr(prefix + this);
                });

Это работает только тогда, когда установлены все возможные флажки, от которых зависит RequiredIf. Следующее проверяет все адреса и выдает сообщения в представлении:

$.each(this.params, function () {
                    paramValues[this] = this.toString() == 'dependentproperty' ? 'Address_' + $element.attr(prefix + this) : $element.attr(prefix + this);
                });

Любая помощь или идеи, почему она ведет себя таким образом, приветствуются =) Другие подходы для решения проблемы я с радостью приму. Спасибо за вашу помощь.


Редактировать

Я понял, что javascript все равно не работает, и теперь уже получаю правильный идентификатор из модели. Но у меня все еще есть ошибка, которая проверяется только тогда, когда установлены все флажки. Есть идеи, почему это так?

Модель для адреса построена следующим образом:

[RequiredIf("IsActive", true)]
    [Display(Name = UserManagementResources.sdAddressText, ResourceType = typeof(UserManagementResources))]
    public string Street
    {
        get { return _address["sdAddress"]; }
        set { _address["sdAddress"] = value; }
    }

    [RequiredIf("IsActive", true)]
    [Display(Name = UserManagementResources.sdCityText, ResourceType = typeof(UserManagementResources))]
    public string City
    {
        get { return _address["sdCity"]; }
        set { _address["sdCity"] = value; }
    }

ViewModel содержит разные адреса.

 public Address Address
    {
        get { return _address ?? (_address = new Address(Customer.Name, _domain, "Address") { IsActive = true }); }
    }

    public Address BillingAddress
    {
        get { return _billingAddress ?? (_billingAddress = new Address(Customer.Name, _domain, "BillingAddress")); }
    }

Контроллер просто создает новую пустую модель. В представлении отображаются разные адреса с использованием Html.EditorFor ().


1 Ответ

1 голос
/ 19 мая 2011

Хорошо, я предполагаю, что ваши общедоступные свойства Address имеют наборы, а также get (не показано выше).Один из способов сделать это - просто отключить форму редактирования адреса, когда пользователь снимает флажок «IsActive».Затем используйте параметр проверки jQuery ignore: ':disabled' или, если вы их скрыли, ignore: ':hidden'.Проверьте этот пример, который использует это:

http://jsfiddle.net/2EfPZ/21/

Из этого вопроса:

Получение ошибки при попытке проверить поля, которые зависят от другого параметра, используяПодключаемый модуль jQuery Validate

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