Puede echar un vistazo al siguiente artículo para escribir un archivo DataAnnotationsModelMetadataProvider
.
Y aquí hay otra forma más ASP.NET MVC 3 de proceder con la interfaz IMetadataAware recién introducida .
Comience creando un atributo personalizado que implemente esta interfaz:
public class PlaceHolderAttribute : Attribute, IMetadataAware
{
private readonly string _placeholder;
public PlaceHolderAttribute(string placeholder)
{
_placeholder = placeholder;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["placeholder"] = _placeholder;
}
}
Y luego decora tu modelo con él:
public class MyViewModel
{
[PlaceHolder("Enter title here")]
public string Title { get; set; }
}
A continuación, defina un controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
}
Una vista correspondiente:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Title)
<input type="submit" value="OK" />
}
Y finalmente la plantilla del editor ( ~/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>
Prompt
funcione.Como smnbss comenta en la respuesta de Darin Dimitrov,
Prompt
existe exactamente para este propósito, por lo que no es necesario crear un atributo personalizado . De la documentación:Para usarlo, simplemente decore la propiedad de su modelo de vista así:
Luego, este texto se coloca convenientemente en
ModelMetadata.Watermark
. Fuera de la caja, la plantilla predeterminada en MVC 3 ignora elWatermark
propiedad, pero hacer que funcione es realmente simple. Todo lo que necesita hacer es ajustar la plantilla de cadena predeterminada para decirle a MVC cómo renderizarla. Simplemente edite String.cshtml, como lo hace Darin, excepto que en lugar de obtener la marca de aguaModelMetadata.AdditionalValues
, la obtiene directamente deModelMetadata.Watermark
:~ / Views / Shared / EditorTemplates / String.cshtml:
Y eso es todo.
Como puede ver, la clave para que todo funcione es la
placeholder = ViewData.ModelMetadata.Watermark
bit.Si también desea habilitar la marca de agua para cuadros de texto de varias líneas (áreas de texto), haga lo mismo para MultilineText.cshtml:
~ / Vistas / Shared / EditorTemplates / MultilineText.cshtml:
fuente
Prompt
atributo. Para obtener más información sobre estas plantillas, puede consultar esta excelente publicación de Brad Wilson: bradwilson.typepad.com/blog/2009/10/…DisplayAttribute
(incluido Prompt) son localizables. Sólo tiene que especificar el TipoRecurso en su anotación:[Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]
. Y eso es. El texto de la marca de agua ahora proviene de AgeGroup clave en el recurso PeopleResources .EditorTemplates
carpeta @FrancisRodgers no está allí de forma predeterminada; simplemente crea en suViews\Shared
carpeta (oViews\{ControllerName}
si desea que sea específico para un controlador determinado). Luego coloque sus plantillas .cshtml dentro de esta carpeta y debería estar listo para comenzar.De hecho, prefiero usar el nombre para mostrar para el texto del marcador de posición la mayor parte del tiempo. A continuación, se muestra un ejemplo del uso de DisplayName:
fuente
Escribí una clase tan simple:
El uso como tal:
Y propiedad en un modelo de vista:
Observe el parámetro Prompt. En este caso, uso cadenas de recursos para la localización, pero puede usar solo cadenas, simplemente evite el parámetro ResourceType.
fuente
Yo uso de esta manera con el archivo de recursos (¡ya no necesito Prompt!)
fuente
Aquí hay una solución que hice usando las ideas anteriores que se pueden usar para TextBoxFor y PasswordFor:
fuente
Creo que crear una plantilla de editor personalizada no es una buena solución, ya que debe preocuparse por muchas plantillas posibles para diferentes casos: cadenas, números, cuadros combinados, etc. Otra solución es la extensión personalizada a HtmlHelper.
Modelo:
Extensión de ayuda HTML:
}
Una vista correspondiente:
fuente