Asp.net mvc 有没有一种简单的方法可以实现递归隐藏?

Asp.net mvc 有没有一种简单的方法可以实现递归隐藏?,asp.net-mvc,Asp.net Mvc,我想要像EditorFor这样的东西,它将为表达式所指向的每个属性生成一个表单。当前行为是生成单个隐藏输入,并使用ToString()值作为值。我想为每个属性创建一组隐藏的输入。如果该值不是基本值,则应将其分解为多个隐藏输入。这允许模型从一个动作传递到另一个动作 我写了一个助手来做这件事,但它似乎应该已经存在了。这是一个助手,以防其他人发现它有用 public static MvcHtmlString MultipleHiddenFor<TModel, TProperty>

我想要像EditorFor这样的东西,它将为表达式所指向的每个属性生成一个表单。当前行为是生成单个隐藏输入,并使用ToString()值作为值。我想为每个属性创建一组隐藏的输入。如果该值不是基本值,则应将其分解为多个隐藏输入。这允许模型从一个动作传递到另一个动作

我写了一个助手来做这件事,但它似乎应该已经存在了。这是一个助手,以防其他人发现它有用

public static MvcHtmlString MultipleHiddenFor<TModel, TProperty>
    (this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    return MultipleHiddenHelper(helper, metadata, ExpressionHelper.GetExpressionText(expression));
}

private static MvcHtmlString MultipleHiddenHelper<TModel>(HtmlHelper<TModel> helper, ModelMetadata metadata, string expression)
{
    var bldr = new StringBuilder();
    foreach (var value in metadata.Properties)
    {
        var propexpression = expression + "." + value.PropertyName;
        if (value.IsComplexType)
        {
            var propmetadata = ModelMetadata.FromStringExpression(propexpression, helper.ViewData);
            bldr.Append(MultipleHiddenHelper(helper, propmetadata, propexpression));
        }
        else
        {
            bldr.Append(helper.Hidden(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(propexpression),
                                          value.Model));
        }
    }

    return new MvcHtmlString(bldr.ToString());
}
public static MvcHtmlString MultipleHiddenFor
(此HtmlHelper帮助程序,表达式)
{
var metadata=modelmetada.FromLambdaExpression(表达式,helper.ViewData);
返回MultipleHiddenHelper(helper,元数据,ExpressionHelper.GetExpressionText(表达式));
}
私有静态MvcHtmlString MultipleHiddenHelper(HtmlHelper、ModelMetadata元数据、字符串表达式)
{
var bldr=新的StringBuilder();
foreach(metadata.Properties中的var值)
{
var propexpression=expression+““+value.PropertyName;
if(value.IsComplexType)
{
var propmetadata=ModelMetadata.FromStringExpression(propexpression,helper.ViewData);
bldr.Append(MultipleHiddenHelper(helper,propmetadata,propexpression));
}
其他的
{
bldr.Append(helper.Hidden(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(propexpression)),
价值模型);
}
}
返回新的MvcHtmlString(bldr.ToString());
}

我不认为这是一个不好的解决方案,但您应该知道,如果您完全像现在这样输出一个对象(可能是一些与数据库相关的对象),那么这些元素可能会被劫持


我的意思是,有人可以更改这些隐藏字段的值(您无论如何都不想编辑这些字段),并有可能更新或插入到数据库中,从而更改您不想更改的内容。

这是以前表单中的所有用户数据,将由后续操作验证,因此我认为这是可以的。