uadrive के जवाब ने मुझे रास्ते का हिस्सा बना दिया, लेकिन अभी भी कुछ अंतराल थे। इनपुट में किसी भी डेटा के बिना new NameValueCollectionValueProvider()
, मॉडल बाइंडर नियंत्रक को एक खाली मॉडल से बांध देगा, न कि model
ऑब्जेक्ट को।
यह ठीक है - बस अपने मॉडल को एक के रूप में क्रमबद्ध करें NameValueCollection
, और फिर उसे NameValueCollectionValueProvider
कंस्ट्रक्टर में पास करें । खैर, काफी नहीं। दुर्भाग्य से, यह मेरे मामले में काम नहीं किया क्योंकि मेरे मॉडल में एक संग्रह है, और NameValueCollectionValueProvider
संग्रह के साथ अच्छी तरह से नहीं खेलता है।
JsonValueProviderFactory
, हालांकि बचाव यहाँ की बात आती है। इसका उपयोग तब तक किया जा सकता है DefaultModelBinder
जब तक आप एक सामग्री प्रकार "application/json
" निर्दिष्ट करते हैं और अपने अनुरोध के इनपुट स्ट्रीम में अपनी क्रमबद्ध JSON ऑब्जेक्ट को पास करते हैं (कृपया ध्यान दें, क्योंकि यह इनपुट स्ट्रीम एक मेमोरी स्ट्रीम है, यह एक स्मृति के रूप में, इसे अपरिहार्य रूप से छोड़ने के लिए ठीक है" धारा किसी भी बाहरी संसाधनों पर पकड़ नहीं रखती है):
protected void BindModel<TModel>(Controller controller, TModel viewModel)
{
var controllerContext = SetUpControllerContext(controller, viewModel);
var bindingContext = new ModelBindingContext
{
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => viewModel, typeof(TModel)),
ValueProvider = new JsonValueProviderFactory().GetValueProvider(controllerContext)
};
new DefaultModelBinder().BindModel(controller.ControllerContext, bindingContext);
controller.ModelState.Clear();
controller.ModelState.Merge(bindingContext.ModelState);
}
private static ControllerContext SetUpControllerContext<TModel>(Controller controller, TModel viewModel)
{
var controllerContext = A.Fake<ControllerContext>();
controller.ControllerContext = controllerContext;
var json = new JavaScriptSerializer().Serialize(viewModel);
A.CallTo(() => controllerContext.Controller).Returns(controller);
A.CallTo(() => controllerContext.HttpContext.Request.InputStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes(json)));
A.CallTo(() => controllerContext.HttpContext.Request.ContentType).Returns("application/json");
return controllerContext;
}