2013-02-13 82 views
4

我正在使用ASP.NET MVC和jQuery通过AJAX调用保存一些数据。我目前传递使用jQuery AJAX()函数一些JSON数据,像这样将JSON数据传递到控制器方法而无需声明对象

$.ajax({ 
    dataType: 'json', 
    type: 'POST', 
    url: '@Url.Action("UpdateName", "Edit")', 
    data: { 
     id: 16, 
     name: 'Johnny C. Bad' 
    } 
}); 

使用这种控制器的方法和辅助类。

public void UpdateName(Poco poco) 
{ 
    var person = PersonController.GetPerson(poco.Id); 
    person.Name = poco.Name; 
    PersonController.UpdatePerson(person); 
} 

public class Poco 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

接受JSON数据的另一种方法是简单地使用多个参数这样

public void UpdateName(int id, string name) 
{ 
    var person = PersonController.GetPerson(id);  
    person.Name = name; 
    PersonController.UpdatePerson(person); 
} 

这种方法是确定的参数,以更小的数字,但我的现实世界中的代码通常已经有大约5 - 10个参数。使用对象而不必声明和使用所有这些参数非常方便。

我wondernig如果有接受JSON数据作为一个单一的对象和不具有声明一个类对于每个控制器的方法我想使用这种方法的另一种方式。例如,这样的事情:

public void UpdateName(dynamic someData) 
{ 
    var person = PersonController.GetPerson(someData.Id); 
    person.Name = someData.Name; 
    PersonController.UpdatePerson(person); 
} 
+0

可以只要将它们转换为JSon,肯定会发布复杂的对象。你会在jscript或Razor变量中构建复杂的对象吗? – 2013-02-13 16:10:00

+0

另一种选择是将json数据作为一个字符串并在动作中反序列化。 – 2013-02-13 16:11:35

+0

http://stackoverflow.com/questions/11608026/asp-net-mvc-can-json-object-be-passed-to-a-controller-with-parameter-with-dynami – 2013-02-13 16:12:13

回答

1

可能的解决方法

创建特定的模型绑定,例如



    public class DynamicModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      if (controllerContext.HttpContext.Request.Form.AllKeys.Any(x => x == "dynamic")) 
      { 
       dynamic model = new ExpandoObject(); 
       IDictionary underlyingmodel = model; 

       foreach (var key in controllerContext.HttpContext.Request.Form.AllKeys) 
        underlyingmodel.Add(key, (bindingContext.ValueProvider.GetValue(key).RawValue as string[]).First()); 

       return model; 
      } 

      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 

该粘合剂将检查特定输入名称为“动态”,然后创建动态对象



    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(dynamic input) 
    { 
     ViewBag.Result = input.phrase; 
     return View(); 
    } 

0

我想这里的问题是确切知道你想在你的控制器之间分享实体之间共同的功能。如果所有这些功能都可以统一在一些共享属性后面(从上面的例子中,可能是Id和Name字段?)然后,您可以来回传递IEntity的实例,或者包含这两个属性的某个基类。

3

可以接受的FormCollection,它看起来像:

public void UpdateName(FormCollection collection) 
{ 
    var person = PersonController.GetPerson(int.Parse(collection["id"])); 
    person.Name = collection["name"]; 
    person.Age = collection["age"]; 

    PersonController.UpdatePerson(person); 
} 
1

我不明白为什么要做到这一点,但你可以用它实现动态的(我没有尝试这个):

public void UpdateName(string parameters) 
{ 
    var dynamicObject = Json.Decode(parameters); 
} 

Json.Decode是System.Web.Healpers命名空间

而且你可以在JavaScript的他们擦肩而过如下:

var dataObject = JSON.stringify({ id: '1', name: 'John' }); 
$.ajax({ 
    dataType: 'json', 
    type: 'POST', 
    url: '@Url.Action("UpdateName", "Edit")', 
    data: dataObject 
}); 
相关问题