如何通过在模型类上使用 Display(prompt) 属性在脚手架视图中的 HTML 输入中获取占位符文本
Posted
技术标签:
【中文标题】如何通过在模型类上使用 Display(prompt) 属性在脚手架视图中的 HTML 输入中获取占位符文本【英文标题】:How to get placeholder text in HTML input in a scaffolded view by using Display(prompt) attribute over model class 【发布时间】:2015-11-24 05:42:19 【问题描述】:我使用脚手架为我生成视图和控制器,并且我使用的是EF代码优先语法。
我了解 T4 模板负责实现生成的 html/视图代码中的属性值,但我没有看到 VS 2015 community edition
提供的默认脚手架模板对占位符文本做任何事情。
根据我的理解,在使用 [Display(Prompt="some placeholder text")]
属性装饰模型属性时,some placeholder text
被显示为输入文本框的占位符
在创建/编辑视图中。
但令我沮丧的是,这并没有发生。
还有其他属性吗?还是我需要做的其他事情?还是因为我使用脚手架生成视图?还是默认的 T4 模板做得不好?
我的模型类代码如下所示:
public class Status
public int ID get; set;
[Required(ErrorMessage ="Status Name is needed!")]
[Display(Name ="Status Name",Prompt ="Type something here!")]
public string StatusName get; set;
[Required]
public string Description get; set;
下面是生成的视图代码:
@model LunchFeedback.Models.Status
@
ViewBag.Title = "Create";
<h2>Create</h2>
@using (Html.BeginForm())
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Status</h4>
<hr />
@Html.ValidationSummary(true, "", new @class = "text-danger" )
<div class="form-group">
@Html.LabelFor(model => model.StatusName, htmlAttributes: new @class = "control-label col-md-2" )
<div class="col-md-10">
@Html.EditorFor(model => model.StatusName, new htmlAttributes = new @class = "form-control" )
@Html.ValidationMessageFor(model => model.StatusName, "", new @class = "text-danger" )
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Description, htmlAttributes: new @class = "control-label col-md-2" )
<div class="col-md-10">
@Html.EditorFor(model => model.Description, new htmlAttributes = new @class = "form-control" )
@Html.ValidationMessageFor(model => model.Description, "", new @class = "text-danger" )
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts
@Scripts.Render("~/bundles/jqueryval")
编辑:
我很清楚,直接编辑视图文件并在那里添加占位符就可以完成这项工作。
@Html.EditorFor(model => model.StatusName, new htmlAttributes = new @class = "form-control", placeholder = "Type something here!" )
但我想控制模型中的所有内容并想使用脚手架。最好甚至编辑/自定义 T4 模板来这样做。
【问题讨论】:
Prompt
的DisplayAttribute
属性和ModelMetadata.Watermark
属性的值。 If 不用于在输入中生成placeholder=".."
属性。
@StephenMuecke 和默认 MVC 模板在构建视图时不使用 ModelMetadata.Watermark
属性?
不,它没有。来自Brad Wilson's blog - “在文本框中编辑此模型时可能显示为水印的文本。默认值:null”。使用这个属性来生成placeholder
属性似乎是合理的,但我假设 MVC 团队只是希望它更灵活一点,并让开发人员决定如何处理它(即在创建你的自己的自定义EditorTemplates
)。
【参考方案1】:
DisplayAttribute
的Prompt
属性将值添加到与该属性关联的ModelMetadata
的WaterMark
属性。它不用于生成 html placeholder
属性。
您希望将其值用作placeholder
属性,但另一个开发人员可能希望使用它来生成工具提示(使用title
属性),因此由开发人员决定如何使用它.
脚手架编辑视图的 T4 模板为模型的属性生成 @Html.Editor()
,因此您可以在 /Views/Shared/EditorTemplates
文件夹中创建自己的 EditorTemplates
(如果您希望将更具体的模板用于特定的控制器)
注意EditorFor()
方法首先在/Views/youControllerName/EditorTemplates
中搜索模板。如果没有找到,则在/Views/Shared/EditorTemplates
中搜索,如果没有找到,则使用默认的EditorTemplate
例如,要为所有类型为string
的属性使用模板,请在EditorTemplates
文件夹中创建一个名为String.cshtml
的局部视图
@Html.TextBox("", ViewData.ModelMetadata.Model, new placeholder = ViewData.ModelMetadata.Watermark )
或将此模板的使用仅限于某些属性,将部分(例如)命名为PlaceHolder.cshtml
,然后在您的属性上使用UIHintAttribute
[Display(Name ="Status Name", Prompt ="Type something here!")]
[UIHint("PlaceHolder")]
public string StatusName get; set;
【讨论】:
【参考方案2】:你可以试试这个
public static class AppEditors
public static MvcHtmlString AppTextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null )
var member = expression.Body as MemberExpression;
var placeholder = member.Member
.GetCustomAttributes(typeof(Display), false)
.FirstOrDefault() as Display;
var attributes = (IDictionary<string, object>)newRouteValueDictionary(htmlAttributes) ?? new RouteValueDictionary();
if (placeholder!= null)
attributes.Add("placeholder", placeholder.Prompt);
return htmlHelper.TextBoxFor(expression, attributes);
在视图中
@AppEditors.AppTextBoxFor(Html,x => x.StatusName)
【讨论】:
感谢您的回答。这真的很有帮助。为 HTML 助手创建自定义扩展也是一个好主意,但我更愿意搭建我的视图并希望利用模板。以上是关于如何通过在模型类上使用 Display(prompt) 属性在脚手架视图中的 HTML 输入中获取占位符文本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 通过 WMI 更新“ds_computer”类上的 LDAP 属性
Django:如何在 list_display 中包含内联模型字段?
通过相关模型上的过滤器对 list_display 字段进行排序
Django通过get_FOO_display 查找模型中的choice值