我为每个输入类型实现了一个编辑模板,它使用我的模型中的“提示”显示注释填充css“占位符”。
在第一个实例中,我刚刚将“placeholder”= ViewData.ModelMetaData.Watermark添加到ViewData,并将ViewData传递给TextBox()HtmlAttributes参数,如此处及其周围的几个帖子所示。 (特别感谢Darin Dimitrov。)
但是,这会产生向每个输入控件添加“returnurl”,“title”和其他几个ViewData属性的效果。不太满意。
我看了一下this post并准备尝试一下,当我想我会接受这个想法并创建一个字符串数组,表示我不希望包含在ViewData属性的键中输入标记并循环遍历ViewData,只添加那些不在该列表中的属性。
这是我的字符串编辑器模板(Shared \ EditorTemplates \ String.cshtml)的代码:
@{
IDictionary<string, object> htmlAtts = new Dictionary<string, object>();
string[] varData = {"ReturnUrl", "Title"}; //there are more values in my actual code
foreach (KeyValuePair<string, object> entry in ViewData)
{
if (!varData.Contains(entry.Key)) {
htmlAtts.Add(entry.Key, entry.Value);
}
}
htmlAtts["placeholder"] = ViewData.ModelMetadata.Watermark;
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAtts)
(顺便说一句,这段代码将被重新考虑以保持干燥)
如果“占位符”由框架实现,或者如果有一种简单的方法来抓取HTML属性并仅将“占位符”添加到这些属性,而不必执行此循环,那将会很好排除非HTML-Attribute-ViewData。
我错过了什么吗?有没有更好的方法来实现此解决方案的功能?
答案 0 :(得分:0)
如果您要完成的只是从ViewData.ModelMetadata.Watermark添加占位符,那么您的字符串模板可以如下所示:
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { placeholder = ViewData.ModelMetadata.Watermark })
您的占位符文本可以在View Model的DataAnnotations中设置。
答案 1 :(得分:0)
正如我在提问中提到的,这是解决问题的字符串编辑器模板的代码(Shared \ EditorTemplates \ String.cshtml):
Application