ইউড্রাইভের উত্তর আমাকে পথের অংশ নিয়েছে তবে কিছু ফাঁক এখনও রয়েছে। ইনপুটটিতে কোনও ডেটা ছাড়াই new NameValueCollectionValueProvider(), মডেল বাইন্ডারটি নিয়ামকটিকে কোনও খালি মডেলকে আবদ্ধ করবে, modelবস্তুর সাথে নয়।
এটি ঠিক আছে - আপনার মডেলটিকে কেবল একটি হিসাবে সিরিয়াল করুন NameValueCollection, এবং তারপরে এটি NameValueCollectionValueProviderকনস্ট্রাক্টরে পাস করুন । ভাল, বেশ না। দুর্ভাগ্যক্রমে, এটি আমার ক্ষেত্রে কার্যকর হয়নি কারণ আমার মডেলটিতে একটি সংগ্রহ রয়েছে এবং সংগ্রহগুলি এটি দুর্দান্তভাবে NameValueCollectionValueProviderখেলছে না।
JsonValueProviderFactoryযদিও রেসকিউ এখানে আসে। এটি DefaultModelBinderযতক্ষণ না আপনি "application/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;
}