Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将JSON数据传递到控制器方法而不必声明对象_C#_Jquery_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 将JSON数据传递到控制器方法而不必声明对象

C# 将JSON数据传递到控制器方法而不必声明对象,c#,jquery,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Jquery,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我使用ASP.NETMVC和jQuery通过AJAX调用保存一些数据。我目前使用jQuery ajax()函数传入一些JSON数据,如下所示 $.ajax({ dataType: 'json', type: 'POST', url: '@Url.Action("UpdateName", "Edit")', data: { id: 16, name: 'Johnny C. Bad' } }); 使用此控制器方法和帮助器类 p

我使用ASP.NETMVC和jQuery通过AJAX调用保存一些数据。我目前使用jQuery ajax()函数传入一些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个参数。使用对象而不必声明和使用所有这些参数非常方便

我想知道是否有另一种方法可以将JSON数据作为单个对象接受,而不必为我想使用这种方法的每个控制器方法声明一个类。例如,类似这样的内容:

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

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

您可以接受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);
}

我不太清楚您为什么要实现这一点,但您可以使用dynamic(动态)来实现(我没有尝试这个):

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 
});
可能的解决办法

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



    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);
        }
    }

此活页夹将检查名为“dynamic”的特定输入,然后创建dynamic对象



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

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


只要将复杂对象转换为JSon,您当然可以发布它们。您是在jscript中还是从Razor变量中构建复杂对象?另一个选项是将json数据作为字符串输入,并在操作中反序列化。该对象来自JavaScript对象。


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

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