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;
}