在动作方法中,如何将后期数据绑定到动态对象?

时间:2016-08-24 14:51:09

标签: javascript c# asp.net-mvc dynamic data-binding

我想这样做:

public ActionResult SaveStuff(dynamic vm) {

    StoreTheValue(vm.myvalue);

    return Content("Saved :)");
}

这不起作用,MVC似乎不想创建一个动态对象,其属性对应于请求的发布数据。

现在我知道正确定义的视图模型的重点是创建强类型数据结构并让MVC将数据绑定到它们中,但考虑到我使用ajax从javascript发布数据它不是无论如何强类型数据,所以我没有看到我通过这样做而失去任何可维护性,这将节省我创建视图模型类的时间和精力。

任何人都可以帮忙建议我如何将后期数据绑定到动态对象,可能使用自定义模型绑定器?

2 个答案:

答案 0 :(得分:1)

带有js

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":{...}
}