c# - 从表达式函数获取属性

标签 c# html generics expression extension-methods

我有一个扩展方法,可以为日期范围选择器输出 HTML。

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

此扩展方法有一个通用属性 TProperty,该属性具有 IDateRange 约束。 IDateRange 接口(interface)具有 FromTo 属性。

我希望能够访问每个 IDateRange 属性,如下所示:

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

由于表达式参数是一个表达式函数,我无法访问这些属性。

我最初有两个表达式参数,一个用于 From 属性,另一个用于 To 属性。

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

但我只想像这样传入 IDateRange 对象

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

最佳答案

可以使用编辑器模板代替:

Views/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)

关于c# - 从表达式函数获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58083946/

相关文章:

c# - 文本框上的火灾事件失去焦点

c# - EF Core 3.0 - 将 SQL 转换为 LINQ

html - 是否可以在CSS中的掩码图像中组合线性渐变和径向渐变?

c# - 在 C# 中的线程之间传递数据的快速、内存高效的方法是什么?

java - Android 插件无法与未找到类异常统一工作?

JQuery 滚动按钮不适用于某些浏览器和移动设备

php - 使用 tpl 的 php 模板中的 if 语句

c# - C# 中存在对相同泛型的更多类约束的替代方案?

c# - 将具体转换为基础通用抽象类的解决方法

java - 为什么泛型不能应用于相同的签名?