【问题标题】:Convert Expression<Func<TModel, TValue>> to Expression<Func<TModel, bool>>将 Expression<Func<TModel, TValue>> 转换为 Expression<Func<TModel, bool>>
【发布时间】:2013-10-03 08:10:30
【问题描述】:

我有一个自定义 HtmlHelper 扩展,它根据帮助器输入参数呈现控件。

我处于一种情况,我可以呈现除 CheckBox 之外的任何控件。正如 CheckBoxFor 助手接受的那样,Expression&lt;Func&lt;TModel, bool&gt;&gt;

我需要一种将 Func 的返回类型转换为 bool 的方法,如标题中所述。

【问题讨论】:

    标签: asp.net-mvc-4 lambda html-helper


    【解决方案1】:

    你可以翻译 lambda:

    public static class HtmlExtensions
    {
        public static IHtmlString MyHelper<TModel, TProperty>(
            this HtmlHelper<TModel> html, 
            Expression<Func<TModel, TProperty>> ex
        )
        {
            if (typeof(TProperty) != typeof(bool))
            {
                throw new InvalidOperationException("You can only generate checkboxes with boolean properties on your view model");
            }
    
            var boolExpression = Expression.Lambda<Func<TModel, bool>>(ex.Body, ex.Parameters);
    
            return html.CheckBoxFor(boolExpression);
        }
    }
    

    现在您可以在模型的布尔属性上使用帮助器:

    @Html.MyHelper(x => x.SomeBooleanProperty)
    

    【讨论】:

    • 当我有一个像Foo.Bar[0].Stick[0].Checked 这样的嵌套属性时,生成的html,name 属性必须像内置的CheckBoxFor 那样的name=Foo.Bar[0].Stick[0].Checked。您的解决方案将 name 属性生成为 name=Checked。 :-(
    • 啊,我的错,我用的是Foo.Bar.First().Stick.First().Checked,而不是Foo.Bar[0].Stick[0].Checked。谢谢! :-)
    • 考虑到我一直在寻找这个问题的正确答案,我希望我至少能给你 10 票。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多