如何设置 "Html.SomeHelper" 属性值等于模型 属性 名称?
How to set "Html.SomeHelper" attribute value to be equal to model property name?
我有表单模型,我想使用 属性 名称作为某些表单字段属性的值。最好的方法是什么? (在这种情况下,我想要 id="PropertyName")。
// FormViewModel
[Display(Name = "First name*")]
[Required(ErrorMessage = "This field is required")]
public string FirstName { get; set; }
// Index.cshtml
<form id="form1" asp-controller="controller" asp-action="Index" method="post">
<div class="form-group">
@Html.TextBoxFor(m => m.FirstName, new
{
@id = "firstName",
@placeholder = Html.DisplayNameFor(m => m.FirstName)
})
@Html.ValidationMessageFor(m => m.FirstName)
</div>
</form>
谢谢!
你不应该像这样逃避你的 placeholder
属性:
@Html.TextBoxFor(m => m.FirstName, new
{
@id = "firstName",
placeholder = Html.DisplayNameFor(m => m.FirstName)
})
此外,在 @id = "firstName"
强类型助手中也不需要默认添加 id
名称为 属性 的属性,因此在您的情况下会像这样:
@Html.TextBoxFor(m => m.FirstName, new
{
placeholder = Html.DisplayNameFor(m => m.FirstName)
})
根据上面的评论,您正在寻找的解决方案似乎是这个
@Html.TextBoxFor(m => m.FirstName,
new { @id = Model.FirstName,
@placeholder = Html.DisplayNameFor(m => m.FirstName)
})
但我想说那里肯定有代码味道......这是一件非常奇怪的事情。
正如@teo van kot 所说,MVC 默认情况下会这样做。但是,如果 属性 的路径类似于 model.Submodel.PropertyName,ID 属性将为 "Submodel_PropertyName"。如果您只需要 "PropertyName",那么可以使用此扩展名 method/wrapper:
public static class Extension method
{
public static IHtmlContent CustomTextBoxFor<TModel, TResult>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TResult>> expression)
{
// very simple implementation, can fail if expression is not as expected!
var body = expression.Body as MemberExpression;
if(body == null) throw new Exception("Expression refers to a method, not a property");
return helper.TextBoxFor(expression, null, new { id = body.Member.Name, placeholder = helper.DisplayNameFor(expression) });
}
}
在剃须刀视图中输出将是这样的:
@Html.CustomTextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" placeholder="Foo" value="">
@Html.TextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" value="">
@Html.CustomTextBoxFor(x => x.AnotherModel.Foo)
<input id="Foo" name="AnotherModel.Foo" type="text" placeholder="Foo" value="">
@Html.TextBoxFor(x => x.AnotherModel.Foo)
<input id="AnotherModel_Foo" name="AnotherModel.Foo" type="text" value="">
第一种和第三种方法存在问题,因此使用此技术,如果您在模型中的多个位置具有相同的 属性 名称:
@Html.CustomTextBoxFor(x => x.DeliveryAddress.StreetName)
@Html.CustomTextBoxFor(x => x.BillingAddress.StreetName)
两个输入标签将具有相同的 ID 属性!
示例是为 MVC6 编写的,MVC5 使用不同的 HtmlHelper 类型。
我有表单模型,我想使用 属性 名称作为某些表单字段属性的值。最好的方法是什么? (在这种情况下,我想要 id="PropertyName")。
// FormViewModel
[Display(Name = "First name*")]
[Required(ErrorMessage = "This field is required")]
public string FirstName { get; set; }
// Index.cshtml
<form id="form1" asp-controller="controller" asp-action="Index" method="post">
<div class="form-group">
@Html.TextBoxFor(m => m.FirstName, new
{
@id = "firstName",
@placeholder = Html.DisplayNameFor(m => m.FirstName)
})
@Html.ValidationMessageFor(m => m.FirstName)
</div>
</form>
谢谢!
你不应该像这样逃避你的 placeholder
属性:
@Html.TextBoxFor(m => m.FirstName, new
{
@id = "firstName",
placeholder = Html.DisplayNameFor(m => m.FirstName)
})
此外,在 @id = "firstName"
强类型助手中也不需要默认添加 id
名称为 属性 的属性,因此在您的情况下会像这样:
@Html.TextBoxFor(m => m.FirstName, new
{
placeholder = Html.DisplayNameFor(m => m.FirstName)
})
根据上面的评论,您正在寻找的解决方案似乎是这个
@Html.TextBoxFor(m => m.FirstName,
new { @id = Model.FirstName,
@placeholder = Html.DisplayNameFor(m => m.FirstName)
})
但我想说那里肯定有代码味道......这是一件非常奇怪的事情。
正如@teo van kot 所说,MVC 默认情况下会这样做。但是,如果 属性 的路径类似于 model.Submodel.PropertyName,ID 属性将为 "Submodel_PropertyName"。如果您只需要 "PropertyName",那么可以使用此扩展名 method/wrapper:
public static class Extension method
{
public static IHtmlContent CustomTextBoxFor<TModel, TResult>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TResult>> expression)
{
// very simple implementation, can fail if expression is not as expected!
var body = expression.Body as MemberExpression;
if(body == null) throw new Exception("Expression refers to a method, not a property");
return helper.TextBoxFor(expression, null, new { id = body.Member.Name, placeholder = helper.DisplayNameFor(expression) });
}
}
在剃须刀视图中输出将是这样的:
@Html.CustomTextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" placeholder="Foo" value="">
@Html.TextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" value="">
@Html.CustomTextBoxFor(x => x.AnotherModel.Foo)
<input id="Foo" name="AnotherModel.Foo" type="text" placeholder="Foo" value="">
@Html.TextBoxFor(x => x.AnotherModel.Foo)
<input id="AnotherModel_Foo" name="AnotherModel.Foo" type="text" value="">
第一种和第三种方法存在问题,因此使用此技术,如果您在模型中的多个位置具有相同的 属性 名称:
@Html.CustomTextBoxFor(x => x.DeliveryAddress.StreetName)
@Html.CustomTextBoxFor(x => x.BillingAddress.StreetName)
两个输入标签将具有相同的 ID 属性!
示例是为 MVC6 编写的,MVC5 使用不同的 HtmlHelper 类型。