Расширение IHtmlHelper – проверка DataTypeAttribute свойства в MyEditorForC#

Место общения программистов C#
Ответить
Anonymous
 Расширение IHtmlHelper – проверка DataTypeAttribute свойства в MyEditorFor

Сообщение Anonymous »

Я создаю свой собственный метод Html.EditorFor, в котором хочу проверить атрибут DataTypeAttribute данного свойства. Получить тип ViewData.Model легко. Но если свойство происходит из другого класса, как в примере строки использования, я не могу найти другого способа, кроме как передать тип класса контейнера в качестве аргумента.
Как можно Я получаю атрибут DataTypeAttribute свойства, опуская аргументContainerType?
Это мой текущий код:

Код: Выделить всё

public static IHtmlContent MyEditorFor(this IHtmlHelper html,
Expression expression,
object moreData,
Type? containerType = null)
{
var ep = html.ViewContext.HttpContext.RequestServices.GetService(typeof(ModelExpressionProvider)) as ModelExpressionProvider;
var bindName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ep.GetExpressionText(expression));

if (containerType == null) containerType = html.ViewData.Model.GetType();
var dataType = GetDataType(containerType, bindName);

//etc...
}

private static DataType GetDataType(Type containerType, string bindName)
{
var result = DataType.Text;
var propName = bindName.Split('.')[^1];
var prop = containerType.GetProperty(propName);
var att = prop.GetCustomAttributes(typeof(DataTypeAttribute), true);
var attProperty = typeof(DataTypeAttribute).GetProperty(nameof(DataTypeAttribute.DataType));
result = (DataType)(attProperty.GetValue(att[0]) ?? DataType.Text);
return result;
}
А вот пример использования:

Код: Выделить всё

@Html.EditorForEx(x => x.LinkedTable[i].MyDate, new { placeholder = "Test Date" }, Model.LinkedTable[i].GetType())
  • Проверки на null опущены для простоты


Подробнее здесь: https://stackoverflow.com/questions/792 ... yeditorfor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»