C# 为'构建隐藏;这是表达

C# 为'构建隐藏;这是表达,c#,asp.net-mvc,lambda,expression-trees,C#,Asp.net Mvc,Lambda,Expression Trees,我正在尝试创建一个可以这样调用的扩展 @Html.HiddenForSuperComplex(x=>x.Abc) 我希望它递归地循环该模型/表达式的属性,并为该模型/表达式中的所有字段创建隐藏项,以便保留该模型 我用下面的话遇到了一个障碍: str = htmlHelper.HiddenForComplex<TProperty,mt>(a.Expression); str=htmlHelper.HiddenForComplex(a.Expression); 但我开始觉得我走错了路

我正在尝试创建一个可以这样调用的扩展

@Html.HiddenForSuperComplex(x=>x.Abc)

我希望它递归地循环该模型/表达式的属性,并为该模型/表达式中的所有字段创建隐藏项,以便保留该模型

我用下面的话遇到了一个障碍:

str = htmlHelper.HiddenForComplex<TProperty,mt>(a.Expression);
str=htmlHelper.HiddenForComplex(a.Expression);
但我开始觉得我走错了路

    public static MvcHtmlString HiddenForSuperComplex<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        TProperty t = htmlHelper.GetValue(expression);
        Type type = typeof(TProperty);
        MvcHtmlString retVal = new MvcHtmlString("");


        var newExpression = expression.Body as NewExpression;
        TModel model = htmlHelper.ViewData.Model;

        foreach (MemberExpression a in newExpression.Arguments)
        {
            Type mt = a.Member.GetType();
            MvcHtmlString str;
            if (ModelUtil.IsSimpleEnough(mt))
            {
                string value = Convert.ToString(GetPropertyValue<TModel>(model, a));
                str = htmlHelper.Hidden(value);
            }
            else
            {
                str = htmlHelper.HiddenForComplex<TProperty,mt>(a.Expression);   //DOES NOT COMPILE
            }
        }
        return retVal;
    }

    private static object GetPropertyValue<T>(T instance, MemberExpression me)
    {
        object target;

        if (me.Expression.NodeType == ExpressionType.Parameter)
        {
            // If the current MemberExpression is at the root object, set that as the target.            
            target = instance;
        }
        else
        {
            target = GetPropertyValue<T>(instance, me.Expression as MemberExpression);
        }

        // Return the value from current MemberExpression against the current target
        return target.GetType().GetProperty(me.Member.Name).GetValue(target, null);
    }

    public static MvcHtmlString HiddenForComplex<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        TProperty t = htmlHelper.GetValue(expression);
        Type type = typeof(TProperty);
        MvcHtmlString retVal = new MvcHtmlString("");

        foreach (PropertyInfo info in t.GetType().GetProperties())
        {
            string value = info.GetValue(t).ToString();
            //string value = (string)type.GetProperty(info.ToString()).GetValue(t, null);
            MvcHtmlString str = htmlHelper.Hidden(value);
            retVal = Concat(retVal, str);

        }
        return retVal;
    }
public static MvcHtmlString HiddenForSuperComplex(此HtmlHelper HtmlHelper,表达式)
{
TProperty t=htmlHelper.GetValue(表达式);
类型类型=类型(t属性);
MvcHtmlString retVal=新的MvcHtmlString(“”);
var newExpression=expression.Body作为newExpression;
TModel model=htmlHelper.ViewData.model;
foreach(newExpression.Arguments中的MemberExpression a)
{
类型mt=a.Member.GetType();
MvcHtmlString-str;
如果(ModelUtil.issimpleough(mt))
{
字符串值=Convert.ToString(GetPropertyValue(model,a));
str=htmlHelper.Hidden(值);
}
其他的
{
str=htmlHelper.HiddenForComplex(a.Expression);//不编译
}
}
返回返回;
}
私有静态对象GetPropertyValue(T实例,MemberExpression me)
{
目标对象;
if(me.Expression.NodeType==ExpressionType.Parameter)
{
//如果当前MemberExpression位于根对象,则将其设置为目标。
目标=实例;
}
其他的
{
target=GetPropertyValue(实例,me.Expression作为MemberExpression);
}
//根据当前目标从当前MemberExpression返回值
返回target.GetType().GetProperty(me.Member.Name).GetValue(target,null);
}
公共静态MvcHtmlString HiddenForComplex(此HtmlHelper HtmlHelper,表达式)
{
TProperty t=htmlHelper.GetValue(表达式);
类型类型=类型(t属性);
MvcHtmlString retVal=新的MvcHtmlString(“”);
foreach(t.GetType().GetProperties()中的PropertyInfo信息)
{
字符串值=info.GetValue(t).ToString();
//字符串值=(字符串)类型.GetProperty(info.ToString()).GetValue(t,null);
MvcHtmlString str=htmlHelper.Hidden(值);
retVal=Concat(retVal,str);
}
返回返回;
}

你也打算在对象图中处理
IEnumerable
属性吗?@DarinDimitrov我没有计划,但如果你看起来像是在试图重新创造
ViewState
,我们很高兴在WebForms世界中摆脱它:-)这一切有什么意义?一个
id
属性就足够了。请记住,不建议从客户端发送不打算由最终用户修改的模型字段作为隐藏字段。如果在回发时从后端数据存储中检索这些值,并且只处理真正可见和需要的模型值,则效率会高得多。同意。似乎这是一种回发类上所有属性的方法,即使它们在表单中没有被修改。简单的解决方案可能是将您的模型序列化为JSON(例如使用JSON.NET),并将其作为一个隐藏值发送。然后在服务器上,您可以手动反序列化它。但我同意@DarinDimitrov的评论