मुझे x-www-form-urlencoded
डेटा पोस्ट करते समय काम करने के लिए कस्टम मॉडल बाध्यकारी होने में बहुत परेशानी हो रही है। मैंने हर तरह से कोशिश की है जिसके बारे में मैं सोच सकता हूं और वांछित परिणाम उत्पन्न करने के लिए कुछ भी नहीं लगता है। ध्यान दें कि जेएसओएन डेटा पोस्ट करते समय, मेरे जेसन कन्वर्टर्स और बहुत आगे सभी ठीक काम करते हैं। यह तब होता है जब मैं x-www-form-urlencoded
के रूप में पोस्ट करता हूं कि सिस्टम यह नहीं समझ सकता कि मेरे मॉडल को कैसे बांधना है।एएसपी.Net वेब एपीआई कस्टम मॉडल x-www-form-urlencoded पोस्ट डेटा के साथ बाध्यकारी - कुछ भी काम नहीं करता
मेरा परीक्षण मामला यह है कि मैं अपने मॉडल के हिस्से के रूप में टाइमज़ोनइन्फो ऑब्जेक्ट को बांधना चाहता हूं।
यहाँ मेरी मॉडल बांधने की मशीन है:
public class TimeZoneModelBinder : SystemizerModelBinder
{
protected override object BindModel(string attemptedValue, Action<string> addModelError)
{
try
{
return TimeZoneInfo.FindSystemTimeZoneById(attemptedValue);
}
catch(TimeZoneNotFoundException)
{
addModelError("The value was not a valid time zone ID. See the GetSupportedTimeZones Api call for a list of valid time zone IDs.");
return null;
}
}
}
यहाँ आधार वर्ग मैं उपयोग कर रहा हूँ है:
public abstract class SystemizerModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var name = GetModelName(bindingContext.ModelName);
var valueProviderResult = bindingContext.ValueProvider.GetValue(name);
if(valueProviderResult == null || string.IsNullOrWhiteSpace(valueProviderResult.AttemptedValue))
return false;
var success = true;
var value = BindModel(valueProviderResult.AttemptedValue, s =>
{
success = false;
bindingContext.ModelState.AddModelError(name, s);
});
bindingContext.Model = value;
bindingContext.ModelState.SetModelValue(name, new System.Web.Http.ValueProviders.ValueProviderResult(value, valueProviderResult.AttemptedValue, valueProviderResult.Culture));
return success;
}
private string GetModelName(string name)
{
var n = name.LastIndexOf(".", StringComparison.Ordinal);
return n < 0 || n >= name.Length - 1 ? name : name.Substring(n + 1);
}
protected abstract object BindModel(string attemptedValue, Action<string> addModelError);
}
मैं इसे सरल अतिरिक्त कस्टम मॉडल बाइंडरों बनाने के लिए बनाने के लिए इस तरह की एक आधार वर्ग का इस्तेमाल किया।
यहां मेरा मॉडल बाइंडर प्रदाता है। ध्यान दें कि यह मेरे आईओसी कंटेनर से सही ढंग से आवंटित हो रहा है, इसलिए मैं अपने कोड के उस पहलू को दिखाने के लिए परेशान नहीं होगा।
public class SystemizerModelBinderProvider : ModelBinderProvider
{
public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType)
{
if(modelType == typeof(TimeZoneInfo))
return new TimeZoneModelBinder();
return null;
}
}
अंत में, यहाँ कार्रवाई विधि और मॉडल वर्ग है:
[DataContract)]
public class TestModel
{
[DataMember]
public TimeZoneInfo TimeZone { get; set; }
}
[HttpPost]
public HttpResponseMessage Test(TestModel model)
{
return Request.CreateResponse(HttpStatusCode.OK, model);
}
कार्रवाई विधि के लिए, मैं कोशिश की है:
public HttpResponseMessage Test([FromBody] TestModel model)
यह FormUrlEncodedMediaFormatter
, जो उपेक्षा करने लगता है invokes मेरी कस्टम मॉडल बांधने की मशीन पूरी तरह से।
public HttpResponseMessage Test([ModelBinder] TestModel model)
यह मेरा कस्टम मॉडल बांधने की मशीन में कहता है, अपेक्षा के अनुरूप है, लेकिन फिर यह केवल RouteData
और QueryString
के लिए और किसी कारण शरीर सामग्री के लिए कुछ भी प्रदान नहीं करता है के लिए ValueProviders प्रदान करता है। नीचे देखें:
मैं भी वर्ग में ही सजा ModelBinder(typeof(SystemizerModelBinderProvider))
साथ जब मैं [ModelBinder] विशेषता का उपयोग क्यों मॉडल केवल बाध्यकारी होती है की कोशिश की है, और क्यों यह केवल पढ़ने की कोशिश करता है मार्ग और क्वेरीस्ट्रिंग मान और शरीर की सामग्री को अनदेखा करते हैं? FromBody
क्यों मेरे कस्टम मॉडल बाइंडर प्रदाता को अनदेखा करता है?
मैं एक परिदृश्य कैसे बना सकता हूं जहां मैं पोस्ट x-www-form-urlencoded
डेटा प्राप्त कर सकता हूं और कस्टम तर्क का उपयोग करके मॉडल गुणों को सफलतापूर्वक बांध सकता हूं?
बस उत्सुक, आप ReSharper प्रयोग करते हैं? –