2012-04-04 19 views
12

Ich frage mich, ob es eine Möglichkeit gibt, die integrierte Modellbindung zu verwenden, die der internen Modellbindung ähnelt, die vor einer Controlleraktion auftritt.Manuelle Modellbindung mit .Net-Mvc

Mein Problem ist, dass ich in der Lage sein möchte, die Bindung zu steuern, da ich den Typ des zu bindenden Objekts nicht kenne, bis ich tatsächlich im Kontext der Controller-Aktion bin.

Ich verstehe ich die Default erben kann benutzerdefinierte Bindung auszuführen, aber ich bin glücklich mit dem, was bereits im Angebote, und will es einfach nutzen - nimm dieses ideal Beispiel eine Vorstellung davon zu bekommen, was ich nach :

public ActionResult DoCustomBinding(string modelType) 
{ 
    ... // logic to determine type to check and create strong 'actual' type 

    object model = BindModel(actualType); 

    ... // do something with bound model 

    return View(); 
} 

ich habe die DefaultModelProvider aber nicht sicher, ob dies der richtige Weg zu gehen, um diese in der Verwendung sieht, und ich war nicht sicher, wie die ModelBindingContext zu erhalten.

+0

Sie haben Recht. Es ist ein schlechtes Benehmen auf einer so nützlichen Seite, ich habe mich gründlich abgezählt. –

+0

Ich werde versuchen, genauer zu sein, mein ultimatives Ziel ist es, eine einzelne Eigenschaft einer Klasse mit Validierungsattributen zu validieren. Also, bewaffnet mit nur einem String-Namen des Typs zu überprüfen, Feldname (n) und Wert (en) - Ich möchte in der Lage sein, das Modell (das ich aus dem Typ erarbeiten müssen) dann zu binden führen Sie Überprüfungen durch. –

+0

Ich werde einen Blick in den ControllerActionInvoker werfen http://aspnet.codeplex.com/SourceControl/changeset/view/72551#266452 es sieht aus wie es mir eine Idee geben könnte, wie es intern getan wird. –

Antwort

0

Haben Sie sich die IModelBinder-Schnittstelle angesehen?

public class CustomModelsBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { } 
} 

Und dann diese Datei auf Ihrer global.asax hinzufügen:

protected override void OnApplicationStarted() { 
    ModelBinders.Binders.Add(typeof(CustomModels), new CustomModelsBinder()); 
} 
+0

Nicht ganz, und ich benutze bereits etwas ähnliches mit Enums zu arbeiten. Ich möchte die interne Engine verwenden und sagen, hier ist der Typ, den ich erstellen und binden möchte, gehen Sie erstellen und binden Sie es und bringen Sie das Ergebnis (außerhalb der normalen Routine einer Controller-Aktion). –

0

Wenn Sie nur bestimmte Teile eines Modells validieren möchten, könnte dies eine Frage Duplikat sein ich MVC Partial Model Updates vorher beantwortet.

Der coole Teil über die Verwendung System.ComponentModel.DataAnnotations.MetadataType ist, dass der Modellbinder die Bindung an ein abgeleitetes Objekt, das im Grunde das gleiche wie das Basisobjekt ist, nur mit anderen Anzeige/Validierung Metadaten bleibt.

+0

Danke - das sieht gut aus, ich habe es gerade geschafft, die Verbindung herzustellen, also habe ich ein paar Lösungen, die ich mir jetzt ansehen kann ... –