2010-06-29 16 views
9

में मोंगो डीबी से ऑब्जेक्टआईडी को कैसे पास करें मैं मोंगो, नोआरएम और एमवीसी नेट के साथ एक नई परियोजना शुरू कर रहा हूं।MVC.net

इससे पहले कि मैं FluentNHibernate का उपयोग कर रहा था, इसलिए मेरी आईडी पूर्णांक थी, अब मेरी आईडी ऑब्जेक्ट आईडी हैं। तो जब मैं एक संपादित करें लिंक है मेरी URL ऐसा दिखाई देगा:

वेबसाइट/व्यवस्थापक/संपादित करें/23,111,160,3,240,200,191,56,25,0,0,0

और यह के रूप में मेरी नियंत्रक को स्वत: बाध्य नहीं करता है एक ऑब्जेक्ट आईडी

क्या आपके पास इस के साथ काम करने के लिए कोई सुझाव/सर्वोत्तम प्रथाएं हैं? क्या मुझे हर बार आईडी को एन्कोड/डीकोड करने की ज़रूरत है?

धन्यवाद!

उत्तर

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()

+1

यह समाधान तब काम नहीं करता जब मान किसी फ़ॉर्म में पास हो जाते हैं। समाधान के लिए मेरा उत्तर देखें जो काम करता है इससे कोई फर्क नहीं पड़ता कि मूल्य कैसे पारित किए जाते हैं। (यह भी ध्यान देने योग्य होगा कि सी # मोंगोडीबी चालक यह था क्योंकि उनके वाक्यविन्यास में भिन्नता है)। –

+0

मूल प्रश्न संदर्भ एएसपी.नेट एमवीसी और मानक कोड में था जो नियंत्रक को url से ऑब्जेक्ट आईडी को पार्स करने की अनुमति देगा। – Sherlock

0

मैं ObjectId प्रकार से परिचित नहीं हूँ, लेकिन आप एक custom model binder कि ObjectId की आवृत्ति id मार्ग बाधा रूपांतरित करेंगे होगा लिख ​​सकते हैं।

0

क्या आप जानते हैं कि आप किसी भी संपत्ति को अद्वितीय कुंजी के रूप में बनाने के लिए [MongoIdentifier] विशेषता का उपयोग कर सकते हैं?

मैं वर्डप्रेस से एक तकनीक उधार ले कर इस मुद्दे को हल कर रहा हूं, जिसमें प्रत्येक इकाई को "यूआरएल स्लग" संपत्ति द्वारा दर्शाया जा सकता है और [MongoIdentifier] के साथ उस संपत्ति को सजाया जा सकता है।

तो अगर मेरे पास जॉनी वॉकर नाम का एक व्यक्ति था तो मैं "जॉनी-वॉकर" का एक स्लग बनाउंगा। आपको बस यह सुनिश्चित करना होगा कि ये यूआरएल स्लग अद्वितीय रहें और आपको बदसूरत ऑब्जेक्ट आईडी के बिना साफ यूआरएल रखना होगा।

+0

हाँ मुझे पता है कि, इसके लिए केवल क्योंकि प्रशासन मुझे साफ यूआरएल रखने की जरूरत नहीं है। अभी के लिए, मैंने एक आईडीवैल्यू प्रॉपर्टी जोड़ा जो ऑब्जेक्टआईडी वैल्यू को स्ट्रिंग के रूप में प्रस्तुत करता है और जब मुझे डेटा लाने की ज़रूरत होती है तो मैं बस करता हूं। सिंगल (नया ऑब्जेक्ट आईडी (आईडी)) यह सुनिश्चित नहीं है कि यह सबसे अच्छा तरीका है लेकिन यह ठीक काम करता है ... – VinnyG

13

यूआरएल बनाने के इस तरह कस्टम मॉडल बांधने की मशीन का प्रयोग करें ... (के खिलाफ सरकारी सी # काम कर 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))); 
    } 
} 
+0

पैरामीटर के साथ झुका हुआ यह एक अपवाद फेंकता है। मुझे लगता है कि TryParse का उपयोग करना और ObjectId.Empty को वापस करना जब यह अमान्य है, इसे संभालने का एक बेहतर तरीका है। – phloopy

0

वेब एपीआई के लिए आप 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)