我想要像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());
}
答案 0 :(得分:0)
我不认为这是一个糟糕的解决方案,但你应该知道,如果你完全输出一个像你正在做的对象(可能是一些与数据库相关的对象),你会让自己开放这些元素被劫持。
我的意思是有人可以改变这些隐藏字段的值(无论如何你都不想编辑),并且可能会更新或插入到数据库中,改变你不想要的东西。