如何通过在模型类上使用 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 模板来这样做。

【问题讨论】:

PromptDisplayAttribute 属性和ModelMetadata.Watermark 属性的值。 If 不用于在输入中生成placeholder=".." 属性。 @StephenMuecke 和默认 MVC 模板在构建视图时不使用 ModelMetadata.Watermark 属性? 不,它没有。来自Brad Wilson's blog - “在文本框中编辑此模型时可能显示为水印的文本。默认值:null”。使用这个属性来生成placeholder 属性似乎是合理的,但我假设 MVC 团队只是希望它更灵活一点,并让开发人员决定如何处理它(即在创建你的自己的自定义EditorTemplates)。 【参考方案1】:

DisplayAttributePrompt 属性将值添加到与该属性关联的ModelMetadataWaterMark 属性。它不用于生成 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值

Django Admin:如何在 oneToOne 关系中的两个模型中显示带有 list_display 的字段值?

django学习——通过get_FOO_display 查找模型中的choice值