Получить свойства из выражения Func - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть метод расширения, который выводит HTML для средства выбора диапазона дат.

public static MvcHtmlString InputGroupDateRangePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, TProperty>> expression) where TProperty : IDateRange

Этот метод расширения имеет общее свойство TProperty, которое имеет ограничение IDateRange.Интерфейс IDateRange имеет свойства From и To.

Я хочу иметь доступ к каждому из свойств IDateRange, например:

var html = $"<div class=\"input-daterange input-group\">
     {htmlHelper.TextBoxFor(expression.From)}
     {htmlHelper.TextBoxFor(expression.To)}</div>";

Как иexpression параметр - функция выражения. Я не могу получить доступ к этим свойствам.

У меня изначально было два параметра выражения, один для свойства From, а другой для свойства To.

Html.InputGroupDateRangePickerFor(x => x.Search.From, x => x.Search.To)

Но я хочу только передать объект IDateRange, например,

Html.InputGroupDateRangePickerFor(x => x.Search.DateRange)

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Я получил его, взяв тело выражения и затем используя его для создания строк выражений From и To.Затем я использовал метод GetExpressionValue, чтобы получить значения IDateRange.

var expressionBody = expression.Body.ToString().Split(new[] { '.' }, 2)[1];

var fromExpressionBody = $"{expressionBody}.{nameof(IDateRange.From)}";
var toExpressionBody = $"{expressionBody}.{nameof(IDateRange.To)}";

var dateRangeValues = GetExpressionValue(htmlHelper, expression);

Затем я использовал эти переменные для генерации HTML.

var html = $"<div class=\"input-daterange input-group\">
     {htmlHelper.TextBox(fromExpressionBody, dateRangeValues.From)}
     {htmlHelper.TextBox(toExpressionBody, dateRangeValues.To)}</div>";
1 голос
/ 25 сентября 2019

Вместо этого можно использовать шаблон редактора:

Представления / Shared / EditorTemplates / DateRange.cshtml

@model Services.Models.DateRange

<div class="col-md-12">
    <div class="form-group">
        @Html.LabelFor(m => m, new { @class = "m-b-none" })
        @Html.DescriptionFor(m => m)
        <div class="input-daterange input-group" style="width: 100%;">
            @Html.TextBoxFor(x => x.From, new{@class="form-control"})
            <span class="input-group-addon">to</span>
            @Html.TextBoxFor(x => x.To, new{@class="form-control"})
            <div class="input-group-addon validation-addon"><i class="fa fa-check-circle green-text validation"></i></div>
        </div>
        @Html.ValidationMessageFor(m => m, null, new { @class = "validation-message" })
    </div>
</div>

Использование:

@Html.EditorFor(x => x.SearchCriteria.ExpectedDateOfDecisionRange)

Или для обеспечения совместимости использования с другими вашими расширениями вы можете заключить это в функцию:

[StringFormatMethod("format")]
public static MvcHtmlString FormGroupDateRangePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression, string format = "{0:dd/MM/yyyy}") where TProperty : IDateRange
{
    var html = $"{htmlHelper.EditorFor(expression)}";
    return new MvcHtmlString(html);
}

Таким образом, использование останется как:

@Html.FormGroupDateRangePickerFor(x => x.SearchCriteria.ExpectedDateOfDecisionRange)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...