2012-12-05 17 views
5

È possibile avere più legami modello personalizzati in Nancy? Ho bisogno di legare la richiesta di elaborazione lato server dal plug-in jQuery dei datatables che non si adatta al nostro modello di binder personalizzato "stile mvc" corrente. In particolare per quanto riguarda gli elenchi, i datatables li presentano come mylist_0, mylist_1 ecc anziché mylist [0], mylist [1].più legatori di modelli personalizzati in Nancy

Così posso aggiungere un altro modello di raccoglitore per gestire questi stili di elenchi diversi e se faccio come Nancy sa quale usare?

risposta

10

È possibile aggiungere un ModelBinder personalizzato al progetto per gestire l'associazione della classe di cui si sta parlando.

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

caso in cui il quadro di rilevare automaticamente il vostro raccoglitore personalizzato, o ne ha bisogno di essere registrato da qualche parte? (i documenti di Nancy sono magri su questo.) –

0

In caso CustomModelBinder non viene rilevato (come capita a me), si può provare l'override in CustomBootstrapper:

protected override IEnumerable<Type> ModelBinders 
    { 
     get 
     { 
      return new[] { typeof(Binding.CustomModelBinder) }; 
     } 
    } 
Problemi correlati