คำตอบของ 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;
}