ASP.Net MVC-5编辑器模板,ViewData&占位符(水印)会导致无关的标记

时间:2013-12-17 13:01:31

标签: asp.net asp.net-mvc asp.net-mvc-5 mvc-editor-templates viewdata

我为每个输入类型实现了一个编辑模板,它使用我的模型中的“提示”显示注释填充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。

我错过了什么吗?有没有更好的方法来实现此解决方案的功能?

2 个答案:

答案 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