asp.net mvc - 有没有办法通过ModelBinder修改TextboxFor,HiddenFor等生成的名称



我研究了这个问题,发现了以下问题:

SO-Link1SO-Link2

所以这个问题似乎很常见——但我真的不喜欢这个解决方案。

问题:

我已经开始挖掘资源,但还没有找到方便的解决方案。现在使用属性是否有内置解决方案?

必须就地使用动态参数而不是在模型上使用属性是非常不方便的。

猜我会看看在此期间通过修改 ModelBinder 可以实现什么 - 我猜必须有某种方法。

更新:

我为什么要这样做?

我想减少网络流量,因为代码中的属性可能很长 + 嵌套。想象一下 200 个复选框 x 40 字节生成的名称。

我已经可以让我的模型绑定器使用别名 - 但是为了完全自动化它,我需要 TextBoxFor 等方法来使用别名而不是实际的属性名称。

就我个人而言,我认为您不应该完全关注 name 属性值的大小。只要您通过IIS之类的东西使用压缩,那么您就不会节省那么多。

但是,您可以通过创建自定义 HTML 帮助程序来实现您所追求的目标,这些帮助程序将创建您想要的 HTML 标记。

示例模型

public class UserModel
{
    public string FullName { get; set; }
}

助手

public static MvcHtmlString CustomTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string name)
{
    var fieldName = ExpressionHelper.GetExpressionText(expression);
    //
    // Pass in alias or call method to get alias here
    //
    var fullBindingName = String.IsNullOrWhiteSpace(name) ? html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName) : name;
    var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var value = metadata.Model;
    var tag = new TagBuilder("input");
    tag.Attributes.Add("name", fullBindingName);
    tag.Attributes.Add("id", fieldId);
    tag.Attributes.Add("type", "text");
    tag.Attributes.Add("value", value == null ? "" : value.ToString());
    var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata);
    foreach (var key in validationAttributes.Keys)
    {
        tag.Attributes.Add(key, validationAttributes[key].ToString());
    }
    return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
}

在视图中调用方法

   @Html.TextBoxFor(x => x.FullName)
   @Html.CustomTextBoxFor(x => x.FullName, "FName")

输出

<input id="FullName" type="text" value="Heymega" name="FullName">
<input id="FName" type="text" value="Heymega" name="FName">

最新更新