2016-08-24 19 views
-2

我想这样做:在动作方法中,如何将发布数据绑定到动态对象?

public ActionResult SaveStuff(dynamic vm) { 

    StoreTheValue(vm.myvalue); 

    return Content("Saved :)"); 
} 

这不起作用,MVC似乎并不想创建一个对应于请求的数据后性能的动态对象。

现在我知道正确定义的视图模型的全部重点是创建强类型的数据结构并将MVC绑定到它们的数据,但鉴于我使用ajax发布JavaScript数据,它不是强类型数据,所以我没有看到我通过这样做失去了可维护性,并且这将节省我创建视图模型类的时间和精力。

任何人都可以帮助建议如何绑定发布数据到动态对象,可能使用自定义模型绑定器?

+1

“将节省我的时间和精力创建视图模型CLAS ses“快速做某事并不总是创建可维护程序的最佳方式。创建DTO对象并不难,因为DTO对象只是保存来自请求的信息,您应该明确地承担这个负担。特别是当你已经知道你的请求的对象是什么样的 - 为什么不为他们创建一个类?只是为了保存一些代码行不是一个好主意。 – HimBromBeere

+0

@HimBromBeere:对不起,但我不感兴趣的回应告诉我,我应该和不应该遵循什么编程指南。我只想知道如何将发布数据绑定到动态对象。 – BG100

回答

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

dynamic类型和ajax请求与js 不对应

你总是可以在js端创建你的强类型对象属性。

反正你可以使用FormCollection这样的:

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

    return Content("Saved :)"); 
} 

但我认为这是更好地想起强类型的方式。

+0

这不会绑定到一个动态的对象...不是我想要的。不管怎么说,还是要谢谢你。 – BG100

+0

@ BG100我的意思是你不能用MVC绑定来做到这一点。如果你不想使用强类型的'ViewModel'唯一的房子是'FormCollection' –

+0

所以你说这是不可能的...?如何使用自定义模型联编程序? – BG100

相关问题