2013-08-23 2 views
0

у меня ViewModel используется для изменения пароля, и он использует Compare DataAnnotation так:Сравните атрибут не использует атрибут отображения сравниваемых собственности

[Display(Name = "New Password")] 
public string New { get; set; } 

[Compare("New")] 
[Display(Name = "Confirm Password")] 
public string ConfirmPassword { get; set; } 

К сожалению, атрибут Compare не использует атрибут Display сравниваемое свойство.

Сообщение об ошибке отображается в виде

'Confirm Password' and 'New' do not match. 

, который вы можете увидеть, использует атрибут сравнения свойства, Display, но не по сравнению имущества.

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

Как я могу присвоить атрибуту Compare атрибут Display сравниваемого свойства?

ответ

2

Я думаю, что это может быть проблемой с атрибутом Compare, так как вы можете увидеть атрибут OtherDisplayName в своем списке свойств, и он правильно использует отображаемое имя для свойства, которое он украшает («Подтвердите пароль», а не "Подтвердите Пароль").

Одна работа вокруг, я нашел это просто создать новый класс, который наследует от CompareAttribute, например, так:

public class CompareWithDisplayName : CompareAttribute 
{ 
    public CompareWithDisplayName(string otherProperty) : base(otherProperty) 
    { 
    } 
} 

Затем используйте его на вашу собственность:

[Display(Name = "New Password")] 
public string New { get; set; } 


[Display(Name = "Confirm Password")] 
[CompareWithDisplayName("New")] 
public string ConfirmPassword { get; set; } 

Я честно не имею идея, почему это работает. Может быть, это что-то связано с отражением или порядком, в котором он определяет, каков атрибут отображения каждого свойства. Создав собственную версию, возможно, упорядочение изменилось? В любом случае, это сделал трюк для меня :)

Edit 2 К сожалению, забыл добавить дополнительную часть, необходимую для проверки на стороне клиента, что объясняется here. Вы можете добавить это в вашем файлеGlobal.asax.cs:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CompareWithDisplayName), typeof(CompareAttributeAdapter)) 

или реализовать IClientValidatable интерфейс на пользовательский атрибут. Оба они показаны в ссылке

+0

К счастью, это действительно работает. К сожалению, это не будет служить моей цели, потому что создание нового атрибута удаляет проверку на стороне клиента jQuery и только проверяет на обратную передачу. Я буду отмечать это как ответ, однако я не буду использовать его в своем проекте. В любом случае спасибо! – Kehlan

+0

Извините, что я обновил ответ с дополнительной работой, которую вам нужно будет сделать для этого: –

+0

Класс CompareAttributeAdapter кажется внутренним для сборки System.Web.Mvc, как вы могли его использовать? – Konamiman

Смежные вопросы