2012-12-05 26 views
5

Bạn có thể có nhiều chất kết dính mô hình tùy chỉnh trong Nancy không? Tôi cần phải ràng buộc yêu cầu xử lý phía máy chủ từ các plugin jQuery datatables mà không phù hợp với chất kết dính mô hình tùy chỉnh "kiểu mvc" hiện tại của chúng tôi. Cụ thể liên quan đến danh sách, datatables trình bày chúng như mylist_0, mylist_1 vv thay vì mylist [0], mylist [1].nhiều chất kết dính mô hình tùy chỉnh ở Nancy

Vì vậy, tôi có thể thêm một trình kết nối mô hình khác để xử lý các kiểu danh sách khác nhau này và nếu tôi làm cách nào Nancy biết sử dụng loại nào?

Trả lời

10

Bạn có thể thêm một ModelBinder tùy chỉnh vào dự án của mình để xử lý sự ràng buộc của lớp bạn đang nói đến.

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

nên khuôn khổ tự động dò tìm chất kết dính tùy chỉnh của bạn, hoặc dùng nó cần phải được đăng ký ở đâu đó? (tài liệu của Nancy rất mỏng về điều này.) –

0

Trong trường hợp CustomModelBinder không được phát hiện (vì nó xảy ra với tôi), bạn có thể thử cách ghi đè nó trong CustomBootstrapper:

protected override IEnumerable<Type> ModelBinders 
    { 
     get 
     { 
      return new[] { typeof(Binding.CustomModelBinder) }; 
     } 
    } 
Các vấn đề liên quan