【问题标题】:multiple custom model binders in NancyNancy 中的多个自定义模型绑定器
【发布时间】:2014-11-11 23:47:27
【问题描述】:

您可以在 Nancy 中拥有多个自定义模型绑定器吗?我需要绑定来自不符合我们当前“mvc 风格”自定义模型绑定器的数据表 jQuery 插件的服务器端处理请求。特别是关于列表,数据表将它们显示为 mylist_0、mylist_1 等,而不是 mylist [0]、mylist [1]。

那么我可以添加另一个模型绑定器来处理这些不同的列表样式吗?如果我这样做了,Nancy 怎么知道要使用哪一个?

【问题讨论】:

    标签: model-binding nancy


    【解决方案1】:

    您可以将自定义 ModelBinder 添加到您的项目中,以处理您正在谈论的类的绑定。

    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);
            }
        }
    }
    

    【讨论】:

    • 框架应该自动检测您的自定义活页夹,还是需要在某个地方注册? (Nancy 文档对此并不了解。)
    • 据我了解,只要您从 IModelBinder 继承,它就会自动检测到它
    【解决方案2】:

    如果没有检测到CustomModelBinder(就像我遇到的那样),您可以尝试在CustomBootstrapper 中覆盖它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2012-02-18
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多