【问题标题】:Aliased Form Names with HtmlHelpers带有 HtmlHelpers 的别名表单名称
【发布时间】: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


    【解决方案1】:

    您拥有要使用的别名,该值可从 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);
        }
    }
    

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

    【讨论】:

    • 正确。我遇到的问题是在编辑器模板中使用助手时。传入的 lambda 不是完整的表达式。不是使用m.Field1.Field.Id 来生成模型元数据,而是使用m.Id。然后我可以获得Id 的别名,但不能获得其余属性。另外,我已经有一个自定义模型绑定器来处理别名,所以我并不担心。
    • 好的,周末不能检查,但我下周去看看
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2023-04-02
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多