2012-12-05 14 views
5

Czy możesz mieć wiele niestandardowych segregatorów modeli w Nancy? Muszę powiązać żądanie przetwarzania po stronie serwera z datatables wtyczki jQuery, która nie pasuje do naszego obecnego "spoiwa model niestandardowy" stylu mvc. W szczególności w odniesieniu do list, datatables przedstawia je jako mylist_0, mylist_1 itd. Zamiast mylist [0], mylist [1].wiele niestandardowych segregatorów modeli w Nancy

Czy mogę dodać inny segregator do obsługi różnych stylów listy, a jeśli tak, to w jaki sposób Nancy wie, której z nich użyć?

Odpowiedz

10

Możesz dodać niestandardowy modelBinder do projektu, aby obsłużyć wiązanie klasy, o której mówisz.

using System; 
using System.IO; 
using Nancy; 

namespace WebApplication3 
{ 
    public class CustomModelBinder : Nancy.ModelBinding.IModelBinder 
    { 
     public object Bind(NancyContext context, Type modelType, object instance = null, params string[] blackList) 
     { 
      using (var sr = new StreamReader(context.Request.Body)) 
      { 
       var json = sr.ReadToEnd(); 
       // you now you have the raw json from the request body 
       // you can simply deserialize it below or do some custom deserialization 
       if (!json.Contains("mylist_")) 
       { 
        var myAwesomeListObject = new Nancy.Json.JavaScriptSerializer().Deserialize<MyAwesomeListObject>(json); 
        return myAwesomeListObject; 
       } 
       else 
       { 
        return DoSomeFunkyStuffAndReturnMyAwesomeListObject(json); 
       } 
      } 
     } 

     public MyAwesomeListObject DoSomeFunkyStuffAndReturnMyAwesomeListObject(string json) 
     { 
      // your implementation here or something 
     } 

     public bool CanBind(Type modelType) 
     { 
      return modelType == typeof(MyAwesomeListObject); 
     } 
    } 
} 
+3

Jeżeli ramy automatycznego wykrywania niestandardowej wiążący, czy też trzeba być gdzieś zarejestrowanym? (Dokumentacja Nancy jest w tym szczupła.) –

0

W przypadku CustomModelBinder nie jest wykrywany (jak to się dzieje do mnie), można spróbować przesłanianie go w CustomBootstrapper:

protected override IEnumerable<Type> ModelBinders 
    { 
     get 
     { 
      return new[] { typeof(Binding.CustomModelBinder) }; 
     } 
    } 
Powiązane problemy