uadrive'ın cevabı beni yolun bir parçası haline getirdi, ancak yine de bazı boşluklar vardı. Girişte herhangi bir veri olmadan new NameValueCollectionValueProvider(), model bağlayıcı denetleyiciyi modelnesneye değil boş bir modele bağlayacaktır .
Sorun değil - modelinizi bir olarak serileştirin NameValueCollectionve sonra bunu kurucuya aktarın NameValueCollectionValueProvider. Pek iyi değil. Ne yazık ki benim durumumda işe yaramadı çünkü modelim bir koleksiyon içeriyor ve koleksiyonlarla iyi NameValueCollectionValueProvideroynamıyor.
Yine JsonValueProviderFactoryde burada kurtarmaya geliyor. DefaultModelBinderBir içerik türü belirlediğiniz "application/jsonve serileştirilmiş JSON nesnenizi isteğinizin giriş akışına ilettiğiniz sürece kullanılabilir (Bu giriş akışı bir bellek akışı olduğundan, onu bir bellek olarak kullanılmadan bırakılmasının sorun olmayacağını lütfen unutmayın. akış herhangi bir harici kaynağı tutmaz):
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;
}