복붙노트

[MONGODB] MVC.net에 MongoDB의에서 ObjectId가 전달하는 방법

MONGODB

MVC.net에 MongoDB의에서 ObjectId가 전달하는 방법

나는 몽고, 규범 및 MVC 닷넷과 함께 새로운 프로젝트를 시작 해요.

내가 FluentNHibernate를 사용 전에 내 ID는 지금 내 ID를 ObjectId가이다, 정수했다 있도록. 내가 편집을 할 때 그래서 내 URL의 모습은 다음과 같이 사용하고 있습니다 :

웹 사이트 / 관리 / 편집 / 23,111,160,3,240,200,191,56,25,0,0,0

그리고는 ObjectId가 아니라 내 컨트롤러에 바인드를 automaticly하지 않습니다

이와 작업에 대한 제안 / 모범 사례가 있습니까? 내가 인코딩을해야하나요 / ID를 매번를 디코딩?

감사!

해결법

  1. ==============================

    1.내가 사용 다음

    내가 사용 다음

    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에서 메이크업 URL을 ()

  2. ==============================

    2.이 같은 사용자 정의 모델 바인더를 사용 (공식 C # MongoDB를 드라이버에 대해 작업)

    이 같은 사용자 정의 모델 바인더를 사용 (공식 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. ==============================

    3.나는 ObjectId가 유형에 익숙하지 오전하지만 당신은 ObjectId가의 인스턴스에 ID 경로 제약 조건을 변환 처리됩니다 사용자 정의 모델 바인더를 작성할 수 있습니다.

    나는 ObjectId가 유형에 익숙하지 오전하지만 당신은 ObjectId가의 인스턴스에 ID 경로 제약 조건을 변환 처리됩니다 사용자 정의 모델 바인더를 작성할 수 있습니다.

  4. ==============================

    4.당신은 당신이 고유 키와 같은 속성 행위를 만들기 위해 [MongoIdentifier] 속성을 사용할 수 있습니다 알고 계십니까?

    당신은 당신이 고유 키와 같은 속성 행위를 만들기 위해 [MongoIdentifier] 속성을 사용할 수 있습니다 알고 계십니까?

    나는 또한 "URL 슬러그"속성에 의해 표현 될 수있는 모든 개체를 가지고와 [MongoIdentifier]에 해당 속성을 장식하여 워드 프레스의 기술을 차용하여이 문제를 해결했습니다.

    그렇다면 나는 조니 워커 내가 "조니 워커"의 슬러그를 만들 것이라는 사람이 있었다. 당신은 반드시 이러한 URL 슬러그 고유 머물 수 있도록해야하고 당신은 추한 객체 식별자없이 깨끗한 URL을 계속 얻을.

  5. ==============================

    5.웹 API 위해 당신은 WebApiConfig에 ULE 바인딩 매개 변수 정의를 추가 할 수 있습니다 :

    웹 API 위해 당신은 WebApiConfig에 ULE 바인딩 매개 변수 정의를 추가 할 수 있습니다 :

    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)
    
  6. from https://stackoverflow.com/questions/3143254/how-to-pass-objectid-from-mongodb-in-mvc-net by cc-by-sa and MIT license