Как генерировать имена полей для словаря состояния модели? - PullRequest
3 голосов
/ 25 августа 2011

Новые вспомогательные методы EditorFor, TextBoxFor очень полезны для избежания жестко закодированных имен полей в представлениях.

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

Существует ли вспомогательный метод, который генерирует полное имя модели?

EDIT:
Samplemodel:

class CustomModel {
  public InnerModel Inner { get; set; }
}
class InnerModel {
  public String Field1 { get; set; }
  public SomethingMoreToValidate[] More { get; set; }
}
class SomethingMoreToValidate {
  public int A { get; set; }
  public int B { get; set; }
}

Поле ввода для InnerModel.SomethingMoreToValidate [0] .A в представлении имеет имя «InnerModel.SomethingMoreToValidate [0] .A». Чтобы связать ошибки состояния модели с полем, я должен поместить ошибки с этим именем в ModelStateDictionary.

В представлении, отображающем данные InnerModel, я могу написать:

Html.EditorFor(m => m.SomethingMoreToValidate[0].A);

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

ModelState.AddModelError(
  "InnerModel.SomethingMoreToValidate[0].A", 
  "There is a problem with this field");

Если свойство переименовано, обратной связи не будет, если у меня нет других проверок, таких как юнит-тесты. Я хотел бы написать:

ModelState.AddModelErrorFor(
  m => m.InnerModel.SomethingMoreToValidate[0].A, 
  "There is a problem with this field")

1 Ответ

7 голосов
/ 26 августа 2011

Вы можете написать помощника, используя GetExpressionText метод:

public static string GetExpressionText<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
    return ExpressionHelper.GetExpressionText(expression);
}

и затем:

var expression = GetExpressionText<MyViewModel, string>(
    x => x.InnerModel.SomethingMoreToValidate[0].A
);

ModelState.AddModelErrorFor(expression, "There is a problem with this field");

При этом, вы, очевидно, должны иметь модульные тесты в правильно написанном приложении.

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