有没有一种方法可以使用@ Html.EditorFor编写Html5占位符,还是应该只使用TextBoxFor扩展名,即
@Html.TextBoxFor(model => model.Title, new { @placeholder = "Enter title here"})
还是编写我们自己的自定义扩展名可能有意义,该扩展名可以通过DataAnnotations使用“描述”显示属性(类似于this)?
当然,同样的问题也适用于“自动对焦”。
您可以阅读以下有关编写自定义的文章DataAnnotationsModelMetadataProvider。
DataAnnotationsModelMetadataProvider
这是涉及新引入的IMetadataAware接口的另一种ASP.NET MVC 3ish更多方法。
首先创建一个实现此接口的自定义属性:
public class PlaceHolderAttribute : Attribute, IMetadataAware { private readonly string _placeholder; public PlaceHolderAttribute(string placeholder) { _placeholder = placeholder; } public void OnMetadataCreated(ModelMetadata metadata) { metadata.AdditionalValues["placeholder"] = _placeholder; } }
然后用它来装饰模型:
public class MyViewModel { [PlaceHolder("Enter title here")] public string Title { get; set; } }
接下来定义一个控制器:
public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel()); } }
相应的视图:
@model MyViewModel @using (Html.BeginForm()) { @Html.EditorFor(x => x.Title) <input type="submit" value="OK" /> }
最后是编辑器模板(~/Views/Shared/EditorTemplates/string.cshtml):
~/Views/Shared/EditorTemplates/string.cshtml
@{ var placeholder = string.Empty; if (ViewData.ModelMetadata.AdditionalValues.ContainsKey("placeholder")) { placeholder = ViewData.ModelMetadata.AdditionalValues["placeholder"] as string; } } <span> @Html.Label(ViewData.ModelMetadata.PropertyName) @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { placeholder = placeholder }) </span>