Vous pouvez consulter l' article suivant pour rédiger une personnalisation DataAnnotationsModelMetadataProvider
.
Et voici une autre façon de procéder, plus ASP.NET MVC 3ish, impliquant la nouvelle interface IMetadataAware .
Commencez par créer un attribut personnalisé implémentant cette interface:
public class PlaceHolderAttribute : Attribute, IMetadataAware
{
private readonly string _placeholder;
public PlaceHolderAttribute(string placeholder)
{
_placeholder = placeholder;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["placeholder"] = _placeholder;
}
}
Et puis décorez votre modèle avec:
public class MyViewModel
{
[PlaceHolder("Enter title here")]
public string Title { get; set; }
}
Ensuite, définissez un contrôleur:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
}
Une vue correspondante:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Title)
<input type="submit" value="OK" />
}
Et enfin le template de l'éditeur ( ~/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
fonctionner.Comme le commentaire smnbss dans la réponse de Darin Dimitrov,
Prompt
existe exactement dans ce but, il n'est donc pas nécessaire de créer un attribut personnalisé . De la documentation:Pour l'utiliser, décorez simplement la propriété de votre modèle de vue comme ceci:
Ce texte est ensuite commodément placé dans
ModelMetadata.Watermark
. Hors de la boîte, le modèle par défaut dans MVC 3 ignore laWatermark
propriété, mais le faire fonctionner est vraiment simple. Tout ce que vous avez à faire est de peaufiner le modèle de chaîne par défaut pour indiquer à MVC comment le rendre. Modifiez simplement String.cshtml, comme le fait Darin, sauf que plutôt que d'obtenir le filigraneModelMetadata.AdditionalValues
, vous l'obtenez directement à partir deModelMetadata.Watermark
:~ / Views / Shared / EditorTemplates / String.cshtml:
Et c'est tout.
Comme vous pouvez le voir, la clé pour que tout fonctionne est le
placeholder = ViewData.ModelMetadata.Watermark
bit.Si vous souhaitez également activer le filigrane pour les zones de texte multilignes (zones de texte), procédez de la même manière pour MultilineText.cshtml:
~ / Views / Shared / EditorTemplates / MultilineText.cshtml:
la source
Prompt
attribut. Pour plus d'informations sur ces modèles, vous pouvez vous référer à cet excellent article de Brad Wilson: bradwilson.typepad.com/blog/2009/10/…DisplayAttribute
(y compris Prompt) sont localisables. Il vous suffit de spécifier le ResourceType dans votre annotation:[Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]
. Et c'est tout. Le texte du filigrane provient désormais de la clé AgeGroup de la ressource PeopleResources .EditorTemplates
dossier @FrancisRodgers n'est pas là par défaut; vous venez de créer dans votreViews\Shared
dossier (ouViews\{ControllerName}
si vous voulez qu'il soit spécifique à un certain contrôleur). Vous placez ensuite vos modèles .cshtml dans ce dossier et vous devriez être prêt à partir.En fait, je préfère utiliser le nom d'affichage pour le texte d'espace réservé la plupart du temps. Voici un exemple d'utilisation de DisplayName:
la source
J'ai écrit une classe si simple:
L'utilisation en tant que telle:
Et la propriété dans un modèle de vue:
Remarquez le paramètre Prompt. Dans ce cas, j'utilise des chaînes de ressources pour la localisation, mais vous pouvez utiliser uniquement des chaînes, évitez simplement le paramètre ResourceType.
la source
J'utilise de cette façon avec le fichier de ressources (je n'ai plus besoin d'invite!)
la source
Voici une solution que j'ai faite en utilisant les idées ci-dessus qui peuvent être utilisées pour TextBoxFor et PasswordFor:
la source
Je pense que créer un EditorTemplate personnalisé n'est pas une bonne solution, car vous devez vous soucier de nombreux tepmlates possibles pour différents cas: chaînes, numsers, comboboxes, etc. Une autre solution est une extension personnalisée vers HtmlHelper.
Modèle:
Extension d'assistance HTML:
}
Une vue correspondante:
la source