gpt4 book ai didi

c# - 通过反射动态调用textboxfor

转载 作者:行者123 更新时间:2023-12-02 17:51:48 27 4
gpt4 key购买 nike

我想要做的最终结果是通过反射(reflect)对象及其属性来动态构建表单。

我已经创建了调用 TextBoxFor 和 CheckBoxFor 等的 HtmlHelper 方法,但现在我需要帮助弄清楚如何在将属性传递给 Html.TextBoxFor 时正确反射(reflect)该属性

这是辅助方法:

public static MvcHtmlString FormTextBox<TModel>(this HtmlHelper<TModel> helper, String id, String property_name, object model, RouteValueDictionary attributes)
{
Type model_type = model.GetType();

return helper.TextBoxFor(model_object => model_type.InvokeMember(property_name, BindingFlags.ExactBinding | BindingFlags.GetProperty, null, model, null));
}

但它在返回时中断并显示以下错误代码:

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

基本上我想采取的是这样的:

@Html.TextBoxFor(model => model.Name)

把它变成这样:

@FormHelpers.FormTextBox("Name", model)

并让它输出相同的内容。

更新

我将重申这一点,因为我在解决问题方面取得了一些进展。

我已经从 Expression.PropertyOrField 创建了一个表达式,它恰好创建了我正在寻找的内容。但是我无法让 TextBoxFor 函数接受它。

Expression fieldExpr = Expression.PropertyOrField(Expression.Constant(model),property_name);

return helper.TextBoxFor(Expression.Lambda<Func<TModel>>(fieldExpr, null).Compile()());

有关如何正确将表达式传递给函数的任何想法吗?

最佳答案

好的,我通过使用属性名称和使用库 System.Linq.Expressions 传入的对象类型构建 lambda 表达式解决了这个问题。

ParameterExpression fieldName = Expression.Parameter(typeof(object), property_name);
Expression fieldExpr = Expression.PropertyOrField(Expression.Constant(model), property_name);
Expression<Func<TModel, object>> exp = Expression.Lambda<Func<TModel, object>>(fieldExpr, fieldName);

return helper.TextBoxFor(exp);

示例:

@{ Name myname = new Name();}
@Html.FormTextBox("first", myname)

fieldName 为左侧(首先)构建一个表达式,然后 fieldExpr 使用类名和属性名称构建表达式的主体。

exp 最终看起来像这样:

first => value(DynamicForm.Models.Name).first

关于c# - 通过反射动态调用textboxfor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com