代码之家  ›  专栏  ›  技术社区  ›  VinnyG

如何在MVC.net中从MongoDB传递ObjectId

  •  9
  • VinnyG  · 技术社区  · 14 年前

    我正在用Mongo、NoRM和MVC.Net启动一个新项目。

    在我使用FluentNHibernate之前,我的id是整数,现在我的id是ObjectId。因此,当我有一个编辑链接时,我的URL如下所示:

    网站/管理/编辑/23111160,3240200191,56,25,0,0,0

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  14
  •   Sherlock    14 年前

    我使用下列命令

    public class ObjectIdModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            string value = controllerContext.RouteData.Values[bindingContext.ModelName] as string;
            if (String.IsNullOrEmpty(value)) {
                return ObjectId.Empty;
            }
            return new ObjectId(value);
        }
    }
    

    protected void Application_Start()
        {
            ......
    
            ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
        }
    

    ObjectId.ToString()

        2
  •  16
  •   Ian Mercer    14 年前

    使用像这样的自定义模型活页夹。。。 (针对官方的C#MongoDB驱动程序)

    protected void Application_Start()
    {
        ...
        ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
    }
    
    public class ObjectIdModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (result == null)
            {
                return ObjectId.Empty;
            }
            return ObjectId.Parse((string)result.ConvertTo(typeof(string)));
        }
    }
    
        3
  •  0
  •   Darin Dimitrov    14 年前

    我不熟悉 ObjectId custom model binder 这将负责转换 id 将约束路由到的实例 目标ID .

        4
  •  0
  •   John Farrell    14 年前

    您知道可以使用[MongoIdentifier]属性使任何属性充当唯一键吗?

    所以如果我有一个叫约翰尼·沃克的人,我会创造一个“约翰尼·沃克”的鼻涕虫。你只需要确保这些url段塞保持唯一,你可以保持干净的url没有丑陋的对象ID。

        5
  •  0
  •   razon    7 年前

    对于Web API,您可以在WebApiConfig中添加自定义参数绑定:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //...
            config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);
            //...
        }
    
        public static HttpParameterBinding GetCustomParameterBinding(HttpParameterDescriptor descriptor)
        {
            if (descriptor.ParameterType == typeof(ObjectId))
            {
                return new ObjectIdParameterBinding(descriptor);
            }
            // any other types, let the default parameter binding handle
            return null;
        }
    
        public class ObjectIdParameterBinding : HttpParameterBinding
        {
            public ObjectIdParameterBinding(HttpParameterDescriptor desc)
                : base(desc)
            {
            }
    
            public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
            {
                try
                {
                    SetValue(actionContext, new ObjectId(actionContext.ControllerContext.RouteData.Values[Descriptor.ParameterName] as string));
                    return Task.CompletedTask;
                }
                catch (FormatException)
                {
                    throw new BadRequestException("Invalid ObjectId format");
                }
            }
        }
    }
    

     [Route("{id}")]
     public IHttpActionResult Get(ObjectId id)
    
    推荐文章