Задать вопрос

Как написать свой кастомный EditorFor и получить значение свойства модели?

.Net 8, Asp.Net Core, Razor C#

Пишу свой хелпер для серверных веб-форм (аналог @Html.EditorFor), что-то вроде этого:
public class FormHelper<TModel>(
  IHtmlHelper<TModel> helper)
  where TModel : class
{
  private readonly IHtmlHelper<TModel> _helper = helper;

  public HtmlString EditorFor<TResult>(
    Expression<Func<TModel, TResult>> expression)
  {
    var name1 = expression.GetMemberAccess().Name;
    // var value1 = ????
    return new HtmlString($"<div>Name: '{name1}'</div>");
  }
}



public static FormHelper<TModel> GetFormHelper<TModel>(
  this IHtmlHelper<TModel> content)
  where TModel : class
{
  var helper1 = new FormHelper<TModel>(content);
  return helper1;
}


Чтобы потом его можно было применить на форме примерно так:
@model MyUser
@{
  var form1 = Html.GetFormHelper();
}
<form asp-action="Edit">
  @form1.EditorFor(x => x.Name)
</form>


В функции EditorFor я получаю имя свойства модели (name1).
А как получить значение (value1) не могу понять?
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
У вас в поле _helper класса FormHelper<TModel> конструктор сохраняет ссылку на интерфейс IHtmlHelper<TModel>.
Этот интерфейс содержит свойство ViewData типа ViewDataDictionary<TModel>. А в этом типе реализовано свойство Model (типа TModel), которое даст вам ссылку на экземпляр класса (типа TModel) модели для представления/страницы.
Ну, а дальше, раз вы знаете имя нужного вам свойства объекта и имеете ссылку на экземпляр этого объекта, то можете получить значение этого свойства: либо через составление с последующей компиляцией и вычисление выражения, возвращающего его значение, либо через отражение.
Как-то так.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы