使用HtmlHelpers的别名表单名称

时间:2011-10-12 19:46:39

标签: forms asp.net-mvc-2 html-helper alias

TL;博士

如何修改生成的表单元素名称以使用来自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?    
    }
}

1 个答案:

答案 0 :(得分:0)

您拥有要使用的别名,该值可从metadata.Model获得,然后您需要做的就是生成HTML。您可以使用标记构建器,string.format或您喜欢的任何内容,为了便于阅读,我将使用string.format并将属性设置为“而不是”。

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"];
        string value = Convert.ToString(value, metadata.Model);

        string html = string.Format(@"<input type='hidden' name='{0}' value='{1}' >", alias, value);    
        return MvcHtmlString.Create(html);
    }
}

但是,这只会处理长网址的问题,这意味着您的模型绑定无法正确绑定您的操作。为此,您需要创建自定义模型绑定器或让您的操作采用具有这些名称属性的viewmodel,然后创建所需模型的新对象并填写其属性或按原样使用viewmodel。