У меня есть ViewModel, которая использует свойства сложных типов, например:
public class UserViewModel {
[Required]
[Display(Name = "First Name")]
[MaxLength(50, ErrorMessage = "Too Long")]
public PresentationObjectField FirstName { get; set; }
}
public class PresentationObjectField
{
public string FieldValue { get; set; }
public bool IsLocked { get; set; }
public string FieldLogicalName { get; set; }
}
Мне нужно создать собственное текстовое поле с некоторыми пользовательскими классами и атрибутами, поэтому в классе HtmlHelper я вызываю следующий метод:
private static string CreateTextBoxField<TModel, TValue>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, RouteValueDictionary htmlAttributes, string fieldValue, bool isLocked)
{
htmlAttributes.Add("data-oldvalue", fieldValue);
if (isLocked)
{
htmlAttributes.Add("readonly", "read-only");
}
MvcHtmlString textbox = htmlHelper.TextBoxFor(expression, htmlAttributes);
return textbox.ToString();
}
Проблема в том, что когда я создаю TextBoxFor, он использует выражение для установки значения ввода. Выражение имеет сложный тип, и когда оно оценивает значение, ему присваивается полное имя типа вместо строки с именем. Мне нужно, чтобы при вызове Html.TextBoxFor (m => m.FirstName) значение было установлено равным m.FirstName.FieldValue.
Если я вызываю помощника, например Html.TextBoxFor (m => m.FirstName.FieldValue), я теряю все аннотации данных для ненавязчивой проверки.
Есть ли способ переопределить значение текстового поля?