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 model
nesneye değil boş bir modele bağlayacaktır .
Sorun değil - modelinizi bir olarak serileştirin NameValueCollection
ve 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 NameValueCollectionValueProvider
oynamıyor.
Yine JsonValueProviderFactory
de burada kurtarmaya geliyor. DefaultModelBinder
Bir içerik türü belirlediğiniz "application/json
ve 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;
}