MVC3 ValidationAttribute validationContext.memberName равно нулю - PullRequest
5 голосов
/ 21 февраля 2012

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

Я создал атрибут проверки, наследующий от ValidationAttribute и IClientValidatable.

Кажется, все работает нормально, и еслиЯ поместил сводку проверки на страницу, на которой отображается ошибка.

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

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

ОДНАКО это - то, где это терпит неудачу, потому что я не могу получить имя члена от validationContext.

есть ли способ, чтобы это произошло?Или я что-то упустил?

public class AdmissionDayCaseAttribute : ValidationAttribute, IClientValidatable
{
    private String DayCaseID;
    private String AdmissionDateID;
    private String DischargeDateID;

    public AdmissionDayCaseAttribute(String DayCaseID, String AdmissionDateID, String DischargeDateID)
    {
        this.DayCaseID = DayCaseID;
        this.AdmissionDateID = AdmissionDateID;
        this.DischargeDateID = DischargeDateID;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        object AdmissionDate = GetPropertyValue(validationContext.ObjectInstance, AdmissionDateID);
        object DischargeDate = GetPropertyValue(validationContext.ObjectInstance, DischargeDateID);
        object AdmissionType = validationContext.MemberName == null ? null : GetPropertyValue(validationContext.ObjectInstance, validationContext.MemberName);
        if (AdmissionDate != null && DischargeDate != null && AdmissionType != null)
        {
            if (AdmissionDate.Equals(DischargeDate) && DayCaseID.Equals(AdmissionType.ToString()))
            {
                return new ValidationResult(ErrorMessage, new List<String>() { validationContext.MemberName });
            }
        }
        return ValidationResult.Success;
    }
    private object GetPropertyValue(object instance,String propertyName)
    {
        Type itype = instance.GetType();
        return itype.GetProperty(propertyName).GetValue(instance,null);
    }
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        ModelClientValidationRule vr = new ModelClientValidationRule()
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "admissiondaycase"
        };
        vr.ValidationParameters.Add(new KeyValuePair<string, object>("admissiondateid", AdmissionDateID));
        vr.ValidationParameters.Add(new KeyValuePair<string, object>("dischargedateid", DischargeDateID));
        vr.ValidationParameters.Add(new KeyValuePair<string, object>("daycaseid", DayCaseID));
        yield return vr;
    }

РЕДАКТИРОВАТЬ / ОБНОВИТЬ

представление выглядит так -

<tr>
    <td>
        @Html.LabelFor(x => x.AdmissionTypeID)
    </td>
    <td>
        @Html.CustomDropDownListFor(a => a.AdmissionTypeID, Lookup.AdmissionTypes,Default.Constant.DROPDOWN)
        @Html.ValidationMessageFor(a=>a.AdmissionTypeID)
    </td>
</tr>

Там нет JavaScript или что-нибудьВзаимодействуя с этим, он довольно прост, но некоторые дополнительные детали - этот код представления находится в шаблоне представления, который используется в частичном представлении

1 Ответ

7 голосов
/ 21 февраля 2012

Сначала убедитесь, что AdmissionDayCaseAttribute правильно определено для свойства в вашей модели.

Затем вместо возврата validationContext.MemberName return validationContext.DisplayName.Если вы изменили имя участника через DsiplayAttribute, вы могли бы сделать что-то вроде этого:

  var memberName = validationContext.ObjectType.GetProperties()
    .Where(p => p.GetCustomAttributes(false)
    .OfType<DisplayAttribute>()
    .Any(a => a.Name == validationContext.DisplayName))
    .Select(p => p.Name).FirstOrDefault(); 

    return new ValidationResult(ErrorMessage, new List<String>() { memberName  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...