2015-08-26 4 views
1

У меня есть сайт, который можно открыть на нескольких языках, строки с сайта извлекаются из XML-файла, который предоставляется владельцем продукта.аннотация нестатической ошибки ErrorMessage в MVC

Модель содержит много полей, но на этот вопрос мы просто глядя на FamilyName

public class RegisterViewModel 
{ 
    public Translation Translation { get; set; } 
    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "LastNameEnter")] 
    [Display(Name = "Last Name")] 
    public string FamilyName { get; set; } 
} 

Я ранее используемый для получения проверки и требуемой ошибки для обменивались сообщениями полей на моих моделях, использующих данный формат. Теперь, хотя у нас есть помощник, который читает XML-файл и создает объект перевода, который содержит список «Item», каждый элемент представляет собой строку с некоторыми другими свойствами.

Я попытался изменить поля на моей модели в следующем формате, однако он не работает, потому что я получаю следующую ошибку:

An object reference is required for the non static field.

[Required(ErrorMessage = Translation.Item.Find(x => x.Id == "FamilyName " && x.Type == "Required").Text)] 
public string FamilyName { get; set; } 

Как я могу идти о создании сообщения об ошибке с помощью моего не статическое имущество Translation.

Свойство перевода задается в конструкторе с контроллера.

EDIT:

Проблема заключается в моем Translation объектов конкретизации опираясь на строки запроса в запросе.

string Language = !String.IsNullOrEmpty(Request.QueryString["l"])? Request.QueryString["l"]: "en-en"; 
model.Translation = RegistrationScriptHelper.Translation.GetRegistrationScript(Request).Find(x => x.Language == Language); 

EDIT 2: Global.asax.cs:

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomRequiredAttribute), 
     typeof(RequiredAttributeAdapter)); 

Выходные:

+0

<входной класс = "входных -block-level "data-val =" true "data-val-email =" Этот адрес электронной почты недействителен. " data-val-required = "Пожалуйста, введите свой адрес электронной почты." id = "Email" name = "Email" tabindex = "3" value = "" type = "text"> ObiEff

ответ

2

Вы должны написать свой собственный атрибут для достижения этой цели. Вот пример:

public class MyReqAttribute : RequiredAttribute 
{ 
    private string _errorID; 
    public MyReqAttribute(string errorID) 
    { 
     _errorID=errorID;   
    } 
    public override string FormatErrorMessage(string name) 
    { 
     string language = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString["l"])? HttpContext.Current.Request.QueryString["l"]: "en-en"; 
     var translation = RegistrationScriptHelper.Translation.GetRegistrationScript(HttpContext.Current.Request).Find(x => x.Language == language); 

     this.ErrorMessage = translation.Item.Find(x => x.Id == errorID 
      && x.Type == "Required").Text; 

     return base.FormatErrorMessage(name); 
    } 

} 

И в Global.asax.cs файл добавить следующую строку:

protected void Application_Start() 
{ 
    // other codes here 

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MyReqAttribute), 
     typeof(RequiredAttributeAdapter)); 
} 

Затем вы можете использовать свой собственный атрибут в вашей модели:

[MyReqAttribute("FamilyName")] 
public string FamilyName { get; set; } 
+0

Как я мог использовать это в представлении? Раньше это было просто @ Html.ValidationMessageFor (m => m.FamilyName) в этом случае мне нужно создать новый html-помощник? – ObiEff

+0

Нет, вам не нужно никаких изменений в вашем представлении. Поскольку мы ввели наш валидатор в MVC в 'Global.asax.cs' –

+0

Правильно, но проблема здесь в том, что Translation не является статическим объектом. Перевод создается в контроллере и добавляется в модель. В этом случае MyReqAttribute не имеет доступа к переводу, и передача его в конструктор для него имеет одинаковую нестатистическую ошибку. – ObiEff

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