Я пытаюсь заставить мое приложение 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 ().