有一种简单的方法来做一个递归的HiddenFor吗?

时间:2011-04-22 19:26:18

标签: asp.net-mvc

我想要像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());
}

1 个答案:

答案 0 :(得分:0)

我不认为这是一个糟糕的解决方案,但你应该知道,如果你完全输出一个像你正在做的对象(可能是一些与数据库相关的对象),你会让自己开放这些元素被劫持。

我的意思是有人可以改变这些隐藏字段的值(无论如何你都不想编辑),并且可能会更新或插入到数据库中,改变你不想要的东西。