当前位置: 首页 > 编程语言 > C#

使用反射动态调用textboxfor

时间:2023-04-10 13:02:09 C#

使用反射动态调用textboxfor我想做的最终结果是通过反射对象及其属性来动态构建表单。我已经创建了调用TextBoxFor和CheckBoxFor等的HtmlHelper方法,但现在我需要帮助弄清楚如何在将属性传递给Html.TextBoxFor时正确反映属性这是帮助方法:publicstaticMvcHtmlStringFormTextBox(thisHtmlHelperhelper,Stringid,Stringproperty_name、对象模型、RouteValueDictionary属性){类型model_type=模型。获取类型();回归帮手。TextBoxFor(model_object=>model_type.InvokeMember(property_name,BindingFlags.ExactBinding|BindingFlags.GetProperty,null,model,}null));但它返回此错误代码:模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式。基本上我想采用这样的方法:@Html.TextBoxFor(model=>model.Name)并将其转换为:@FormHelpers.FormTextBox("Name",model)并让它输出相同的内容。更新我要重申这一点,因为我在解决问题方面取得了一些进展。我从Expression.PropertyOrField创建了一个Expression,它创建了我正在寻找的内容。但是我无法让TextBoxFor函数接受它。表达式字段Expr=Expression.PropertyOrField(Expression.Constant(model),property_name);返回helper.TextBoxFor(Expression.Lambda(fieldExpr,null).Compile()());关于如何正确地将表达式传递给函数有什么想法吗?好吧,我通过构建一个带有属性名称和传入对象类型的lambda表达式来解决这个问题。我的函数如下所示:ParameterExpressionfieldName=Expression.Parameter(typeof(object),property_name);表达式fieldExpr=Expression.PropertyOrField(Expression.Constant(model),property_name);表达式>exp=Expression.Lambda>(fieldExpr,fieldName);返回helper.TextBoxFor(exp);示例:@{Namemyname=newName();}@Html.FormTextBox("first",myname)fieldName为左侧(第一个)构建表达式,然后fieldExpr使用类名和属性名构建表达式的主体。exp最终看起来像这样:first=>value(DynamicForm.Models.Name).first现在我需要做的就是确保我的数据注释仍然有效。