Câu trả lời của uadrive đã giúp tôi đi được một phần chặng đường, nhưng vẫn còn một số khoảng trống. Không có bất kỳ dữ liệu nào trong đầu vào new NameValueCollectionValueProvider()
, chất kết dính mô hình sẽ liên kết bộ điều khiển với một mô hình trống, không phải với model
đối tượng.
Điều đó tốt - chỉ cần tuần tự hóa mô hình của bạn dưới dạng a NameValueCollection
, và sau đó chuyển nó vào hàm NameValueCollectionValueProvider
tạo. Chà, không hoàn toàn. Thật không may, nó không hoạt động trong trường hợp của tôi vì mô hình của tôi có chứa một bộ sưu tập và NameValueCollectionValueProvider
nó không phù hợp với các bộ sưu tập.
Tuy nhiên, JsonValueProviderFactory
sự giải cứu đến ở đây. Nó có thể được sử dụng DefaultModelBinder
miễn là bạn chỉ định loại nội dung là "application/json
"và chuyển đối tượng JSON được tuần tự hóa của bạn vào luồng đầu vào của yêu cầu của bạn (Xin lưu ý, vì luồng đầu vào này là luồng bộ nhớ, bạn có thể để nó không bị tranh cãi, như một bộ nhớ luồng không giữ bất kỳ tài nguyên bên ngoài nào):
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;
}