Laden...

asp.net mvc 3: Zugriff auf DataAnnotations

Erstellt von M@TUK vor 13 Jahren Letzter Beitrag vor 13 Jahren 960 Views
M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 13 Jahren
asp.net mvc 3: Zugriff auf DataAnnotations

Hi,

es gibt ja die DataAnnotations wo Validierungs-Attribute angegeben werden können,
die dann z.b. von StronglyTyped Views bei asp.net mvc für den Aufbau der
Input-Felder und der Validierung verwendet werden..


...
Html.TextBoxFor(model => model.FieldName)
...

Kann man das auch "selber verwenden" bzw. wie?

Ich hab mir für mein Backend ein eigenes UI-Framework geschrieben,
mit dem ich die Formfields programmatisch und nicht in den Views
hinzufüge. Derzeit gebe ich "ID", "Name" und die Validierungen immer
in der jeweiligen "View-Klasse" manuell an. Es wäre aber perfekt
wenn ich hier ebenfalls die DataAnnotations verwenden könnte und
die manuelle Version nur für Sonderfälle verwenden bräuchte...

zur Zeit


PVField f1 = new PVField();
f1.Name = "Vorname";
f1.Id = "Firstname";
f1.Type = PVFieldType.Textbox;
f1.Value = model.Firstname;
f1.Validators.Add(new RequiredValidator() {ErrorMessage="muss angegeben werden" }
this.EditFields.Add(f1);

gewünscht


PVField f1 = new PVField(model => model.Firstname);
f1.Type = PVFieldType.Textbox;
this.EditFields.Add(f1);

S
417 Beiträge seit 2008
vor 13 Jahren

Wenn ich das richtig verstehe, willst du die Validierung der DataAnnotation manuell anstossen?!
Falls ja, dann ist diese Klasse etwas für dich:

System.ComponentModel.DataAnnotations.Validator
M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 13 Jahren

Hi,

nein nicht unbedingt...

ich möchte der Klasse das Model bzw. das Property
übergeben (sow wie Html.TextboxFor...) und
damit dann darüber an die Werte kommen...

Id => Propertyname
Name => DataAnnotation
Validation => DataAnnotations
....

C
24 Beiträge seit 2009
vor 13 Jahren

Hi,

kurz vorweg, mit meinem Posting nehme ich nur Bezug auf:

PVField f1 = new PVField(model => model.Firstname);

Das was du in dem Fall übersiehst ist der HtmlHelper<TModel> im Hintergrund. Normalerweise würde man eine eigene Methode im Zusammenhang mit dem HtmlHelper wie folgt schreiben:


[Extension]
public void Foo<TModel, TResult>(this HtmlHelper<TModel> helper, this Expression<Func<TModel, TResult>> property)
{
    // ...
}

Bei einem Aufruf müssen TModel und TResult nicht explizit angegeben werden, da sie durch die typisierte HtmlHelper-Klasse implizit ermittelt werden können.

Anders jedoch ist es bei dem von dir beschriebenen, gewünschten, Szenario. Du hast keine Klasse aus der implizit TModel, bzw. darauf aufbauend TResult, ermittelt werden kann. Somit müsstest du die Klassen explizit angeben. Das sähe dann wie folgt aus:


public class Foo
{
    public Foo<TModel, TResult>(this Expression<Func<TModel, TResult>> property)
    {
        MemberExpression memberExpression = property.Body as MemberExpression;
        string propertyName = memberExpression.Member.Name;
        // ...
    }
}

// Aufruf
var foo = new Foo<MyObject, MyProperty>(model => model.MyProperty);

Damit könntest du dann direkt den Property-Namen bestimmen und via Reflection an die Attributes gelangen (http://msdn.microsoft.com/en-us/library/a4a92379.aspx).

Chris