【发布时间】:2011-10-12 19:46:39
【问题描述】:
tl;dr
如何修改生成的表单元素名称以使用来自ModelMetadata.AdditionalValues 的别名?最好使用自定义(或非自定义)html 帮助器。
我有一个带有一些自定义对象属性的搜索视图模型。在我看来,每个属性都有另外两个属性。在我看来,我也使用编辑器模板。我的表单最终包含如下元素:
HTML
<input name="Field1.Field.Id" id="..." type="..." />
<input name="Field1.Field.Label" id="..." type="..." />
<input name="Field2.Field.Id" id="..." type="..." />
<input name="Field2.Field.Label" id="..." type="..." />
Search.spark (.aspx)
${ Html.EditorFor(m => m.Field1) } // Field1 is of type SearchField
${ Html.EditorFor(m => m.Field2) } // Field2 is of type SearchField
etc...
SearchField.spark (.ascx)
<viewdata model="SearchField" />
// *snip*
${ Html.EditorFor(m => m.Field) } // Field is of type SpecialField
SpecialField.spark (.ascx)
<viewdata model="SpecialField" />
${ Html.HiddenFor(m => m.Id) } // Id is of type int?
${ Html.TextBoxFor(m => m.Label } // Label is of type string
因为表单使用GET,我最终得到了很长的查询字符串。我想做的是为属性提供别名。我已经有一个属性、一个用于填充 AdditionalValues 的模型元数据提供程序和一个用于处理别名的自定义模型绑定器,但我一直无法生成正确的 html。
我以为我只需要编写一个自定义 html 帮助程序,但很快就卡住了。
public static MvcHtmlString HiddenForA<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
if (metadata.AdditionalValues.ContainsKey("Alias"))
{
string alias = (string)metadata.AdditionalValues["Alias"];
// what to do now?
}
}
【问题讨论】:
标签: forms asp.net-mvc-2 html-helper alias