我研究了这个问题,发现了以下问题:
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">