【问题标题】:In an action method, how can I bind post data to a dynamic object?在 action 方法中,如何将 post 数据绑定到动态对象?
【发布时间】:2016-12-31 18:52:13
【问题描述】:

我想这样做:

public ActionResult SaveStuff(dynamic vm) {

    StoreTheValue(vm.myvalue);

    return Content("Saved :)");
}

这不行,MVC 似乎不想创建一个动态对象,其属性与请求的 post 数据相对应。

现在我知道正确定义视图模型的全部意义在于创建强类型数据结构并将 MVC 绑定数据到其中,但鉴于我使用 ajax 从 javascript 发布数据,它无论如何都不是强类型数据,所以我没有看到这样做会失去任何可维护性,并且可以节省我创建视图模型类的时间和精力。

谁能帮助建议我如何将帖子数据绑定到动态对象,可能使用自定义模型绑定器?

【问题讨论】:

  • “将节省我创建视图模型类的时间和精力”快速做某事并不总是创建可维护程序的最佳方式。创建仅保存您请求中的信息的 DTO 对象并不难,您绝对应该负担得起。特别是当你已经知道你的请求的对象是什么样子时——为什么不为它们创建一个类呢?仅仅为了节省一些代码行不是一个好主意。
  • @HimBromBeere:对不起,但我不感兴趣告诉我应该和不应该遵循哪些编程指南。我只是想知道如何将帖子数据绑定到动态对象。

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


【解决方案1】:

dynamic 类型和您使用 javascript 执行的 ajax 请求不对应

您始终可以在 javascript 端创建强类型对象属性。

无论如何你都可以像这样使用FormCollection

[HttpPost]
public ActionResult yourAction(FormCollection collection)
{
    StoreTheValue(Convert.ToString(collection["myvalue"]));

    return Content("Saved :)");
}   

但我认为考虑一种强类型的方式会更好。

【讨论】:

  • 这不会绑定到动态对象...不是我想要的。无论如何,谢谢。
  • @BG100 我的意思是你不能用 MVC 绑定来做到这一点。如果你不想使用强类型的ViewModel,唯一的选择是FormCollection
  • 所以你是说不可能...?使用自定义模型绑定器怎么样?
  • @BG100 你可以试试。但这不值得。如果您需要动态的一切,只需在服务器端使用 js ;) nodeJs - 是您最好的朋友。您根本不需要任何带有模型绑定的 MVC
【解决方案2】:

实现此目的的一种可能方法是使用自定义模型绑定器,假设您将 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":{...}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2016-12-26
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多