Sie können den folgenden Artikel lesen, um eine benutzerdefinierte zu schreiben DataAnnotationsModelMetadataProvider
.
Und hier ist eine weitere, mehr ASP.NET MVC 3ish-Methode, um mit der neu eingeführten IMetadataAware- Schnittstelle fortzufahren .
Erstellen Sie zunächst ein benutzerdefiniertes Attribut, das diese Schnittstelle implementiert:
public class PlaceHolderAttribute : Attribute, IMetadataAware
{
private readonly string _placeholder;
public PlaceHolderAttribute(string placeholder)
{
_placeholder = placeholder;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["placeholder"] = _placeholder;
}
}
Und dann dekorieren Sie Ihr Modell damit:
public class MyViewModel
{
[PlaceHolder("Enter title here")]
public string Title { get; set; }
}
Definieren Sie als Nächstes eine Steuerung:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
}
Eine entsprechende Ansicht:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Title)
<input type="submit" value="OK" />
}
Und zum Schluss die Editor-Vorlage ( ~/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
Arbeit macht.Da smnbss-Kommentare in Darin Dimitrovs Antwort
Prompt
genau zu diesem Zweck vorhanden sind, muss kein benutzerdefiniertes Attribut erstellt werden . Aus der Dokumentation:Um es zu verwenden, dekorieren Sie einfach die Eigenschaft Ihres Ansichtsmodells wie folgt:
Dieser Text wird dann bequem in platziert
ModelMetadata.Watermark
. Standardmäßig ignoriert die Standardvorlage in MVC 3 dieWatermark
Eigenschaft, aber es ist wirklich einfach, sie zum Laufen zu bringen. Sie müssen lediglich die Standardzeichenfolgenvorlage anpassen, um MVC mitzuteilen, wie sie gerendert werden soll. Bearbeiten Sie einfach String.cshtml, wie es Darin tut, außer dass Sie das Wasserzeichen nichtModelMetadata.AdditionalValues
erhalten, sondern direkt vonModelMetadata.Watermark
:~ / Views / Shared / EditorTemplates / String.cshtml:
Und das ist alles.
Wie Sie sehen können, ist der Schlüssel, damit alles funktioniert, das
placeholder = ViewData.ModelMetadata.Watermark
Bit.Wenn Sie das Wasserzeichen auch für mehrzeilige Textfelder (Textbereiche) aktivieren möchten, tun Sie dasselbe für MultilineText.cshtml:
~ / Views / Shared / EditorTemplates / MultilineText.cshtml:
quelle
Prompt
Attribut zu tun ist . Weitere Informationen zu diesen Vorlagen finden Sie in diesem großartigen Beitrag von Brad Wilson: bradwilson.typepad.com/blog/2009/10/…DisplayAttribute
(einschließlich Eingabeaufforderung) sind lokalisierbar. Sie müssen nur den Ressourcentyp in Ihrer Anmerkung angeben :[Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]
. Und das ist es. Wasserzeichentext stammt jetzt von der wichtigsten AgeGroup in der Ressource PeopleResources .EditorTemplates
Ordner @FrancisRodgers ist standardmäßig nicht vorhanden. Sie erstellen nur in IhremViews\Shared
Ordner (oderViews\{ControllerName}
wenn Sie möchten, dass es für einen bestimmten Controller spezifisch ist). Sie platzieren dann Ihre .cshtml-Vorlagen in diesem Ordner und Sie sollten bereit sein, loszulegen.Eigentlich bevorzuge ich es, den Anzeigenamen die meiste Zeit für den Platzhaltertext zu verwenden. Hier ist ein Beispiel für die Verwendung des Anzeigenamens:
quelle
Ich habe eine so einfache Klasse geschrieben:
Die Verwendung als solche:
Und Eigentum in einem Ansichtsmodell:
Beachten Sie den Eingabeaufforderungsparameter. In diesem Fall verwende ich Zeichenfolgen aus Ressourcen zur Lokalisierung, aber Sie können nur Zeichenfolgen verwenden. Vermeiden Sie einfach den Parameter ResourceType.
quelle
Ich benutze diesen Weg mit der Ressourcendatei (brauche keine Eingabeaufforderung mehr!)
quelle
Hier ist eine Lösung, die ich mit den oben genannten Ideen gemacht habe, die für TextBoxFor und PasswordFor verwendet werden können:
quelle
Ich denke, ein benutzerdefiniertes EditorTemplate zu erstellen ist keine gute Lösung, da Sie sich um viele mögliche Tepmlates für verschiedene Fälle kümmern müssen: Zeichenfolgen, Nummern, Kombinationsfelder und so weiter. Eine andere Lösung ist die benutzerdefinierte Erweiterung von HtmlHelper.
Modell:
HTML-Helfer-Erweiterung:
}}
Eine entsprechende Ansicht:
quelle