我想这样做:
public ActionResult SaveStuff(dynamic vm) {
StoreTheValue(vm.myvalue);
return Content("Saved :)");
}
这不起作用,MVC似乎不想创建一个动态对象,其属性对应于请求的发布数据。
现在我知道正确定义的视图模型的重点是创建强类型数据结构并让MVC将数据绑定到它们中,但考虑到我使用ajax从javascript发布数据它不是无论如何强类型数据,所以我没有看到我通过这样做而失去任何可维护性,这将节省我创建视图模型类的时间和精力。
任何人都可以帮忙建议我如何将后期数据绑定到动态对象,可能使用自定义模型绑定器?
答案 0 :(得分:1)
dynamic
类型和ajax请求不对应
您始终可以在js端创建强类型对象属性。
无论如何,您可以像这样使用FormCollection
:
[HttpPost]
public ActionResult yourAction(FormCollection collection)
{
StoreTheValue(Convert.ToString(collection["myvalue"]));
return Content("Saved :)");
}
但我认为考虑强类型的方式会更好。
答案 1 :(得分:1)
实现此目的的一种可能方法是使用自定义模型绑定器,假设您将Json发布到操作
public class DynamicBinder : IModelBinder
{
public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext )
{
using( var streamReader = new StreamReader( controllerContext.HttpContext.Request.InputStream ) )
{
return JsonConvert.DeserializeObject< dynamic >( streamReader.ReadToEnd() );
}
}
}
然后在您的操作中,您可以告诉它,使用自定义绑定器
public ActionResult SaveStuff([ModelBinder(typeof(DynamicBinder))]dynamic vm) {
StoreTheValue(vm.myvalue);
return Content("Saved :)");
}
然后发布你的json:
{
"myvalue":{...}
}