16

Ich versuche, einige Beispiele zum Erstellen eines benutzerdefinierten Modellbinders für ein eindeutiges Bindungsszenario zu finden, das ich behandeln muss, aber alle Artikel, die ich fand, waren für ältere Versionen von MVC in MVC2 nicht mehr relevant. Ich habe auf den DefaultModelBinder-Quellcode verwiesen, um ein allgemeines Gefühl dafür zu bekommen, was ich tun muss, aber es ist komplizierter als mein Szenario und ich habe Probleme, die spezifische Logik zu isolieren, die ich implementieren muss.ASP.NET MVC2 - Benutzerdefinierte Modellbinder Beispiele

Mein Ziel ist es, eine Sammlung von Checkbox/Textbox-Paaren zu nehmen und für alle Checked-Paare möchte ich ein Schlüssel/Wert-Paar des Checkbox-Wertes und des zugehörigen Textfelds erstellen. Nach dem Zusammenfassen dieser Daten muss ich eine String-Serialisierung für die Sammlung durchführen, damit ich sie in einer String-Eigenschaft des gewünschten Modelltyps speichern kann. Ich habe bereits die Daten aus dem Formular in einem überschaubaren Format gesendet, das es mir erlaubt, eine bestimmte Checkbox mit einer bestimmten Textbox zu verbinden. Es geht nur darum, herauszufinden, wie man alle Teile dorthin bringt, wo ich sie brauche.

Kennt jemand einige aktuelle Tutorials, mit denen ich mit dem Erstellen eines benutzerdefinierten Modellbinders beginnen kann?

Antwort

12

Ich weiß nicht, warum Sie denken, viel hat sich seit MVC 1 in Bezug auf benutzerdefinierte Modellbinder geändert. Aber wenn ich verstehe, was Sie versuchen, sollte es ziemlich einfach sein.

public class CustomModelBinder : DefaultModelBinder { 
    public override object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) { 

     NameValueCollection form = controllerContext.HttpContext.Request.Form; 
     //get what you need from the form collection 

     //creata your model 
     SomeModel myModel = new SomeMode(); 
     myModel.Property = "value"; 
     //or add some model errors if you need to 
     ModelStateDictionary mState = bindingContext.ModelState; 
     mState.Add("Property", new ModelState { }); 
     mState.AddModelError("Property", "There's an error."); 

     return myModel; //return your model 
    } 
} 

Und Ihre Aktion:

public ActionResult Contact([ModelBinder(typeof(CustomModelBinder))]SomeModel m){ 
    //... 
} 

War das die Art von Informationen, die Sie suchen?

+2

Diese Technik funktioniert völlig für mich, aber ich hatte den Eindruck, ich sollte den 'bindingContext.ValueProvider' verwenden, anstatt direkt auf den HttpContext zuzugreifen (aus Gründen der Testbarkeit). –

+0

@Nathan Taylor, ich verstehe. In diesem Fall könnte die hier beschriebene Technik Ihnen den Einstieg erleichtern. http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx S. Hanselman bietet auch ein Beispiel hier zum Testen der Bindemittel: http://StackOverflow.com/Questions/253574/How-to-test-custom -model-binders-in-asp-net-mvc/589250 # 589250 –

+0

Wenn Sie nach einer Modellbindung auf der Basis eines bestimmten (oder generischen) Typs suchen, sehen Sie sich den Beitrag hier an: http://stackoverflow.com/questions/1487005/asp-net-mvc-type-binder-for-generic-type –

1

Werfen Sie einen Blick auf mehrere Beispiele von Custom MVC Model binders auf meinem Blog.

+1

Die Website ist offline und die Beispiele sollten hier veröffentlicht werden - keine externe Seite. –