2014-02-05 68 views
53

我一直在尝试整个下午通过Web爬行尝试接收操作控制器中的JSON对象。如何接收JSON作为MVC 5操作方法参数

什么是正确或更简单的方法去做呢?

我曾尝试以下: 1:

//Post/ Roles/AddUser 
    [HttpPost] 
    public ActionResult AddUser(String model) 
    { 
     if(model != null) 
     { 
      return Json("Success"); 
     }else 
     { 
      return Json("An Error Has occoured"); 
     } 

    } 

这给了我在我输入一个空值。

2:

//Post/ Roles/AddUser 
    [HttpPost] 
    public ActionResult AddUser(IDictionary<string, object> model) 
    { 
     if(model != null) 
     { 
      return Json("Success"); 
     }else 
     { 
      return Json("An Error Has occoured"); 
     } 

    } 

,给了我一个500错误jQuery开发方面正试图张贴到了吗? (意思是它没有正确绑定)。

这里是我的jQuery代码:

<script> 
function submitForm() { 

    var usersRoles = new Array; 
    jQuery("#dualSelectRoles2 option").each(function() { 
     usersRoles.push(jQuery(this).val()); 
    }); 
    console.log(usersRoles); 

    jQuery.ajax({ 
     type: "POST", 
     url: "@Url.Action("AddUser")", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: JSON.stringify(usersRoles), 
     success: function (data) { alert(data); }, 
     failure: function (errMsg) { 
      alert(errMsg); 
     } 
    }); 
} 

所有我想要做的就是接受我的JSON对象在我的MVC的行动?

+0

虽然这指定MVC5,解决方案是相同的,所以这是[将JSON数据发布到ASP.NET MVC]的副本(http://stackoverflow.com/questions/ 4164114/posting-json-data-to-asp-net-mvc) –

回答

57

不幸的是字典有问题总是与模型MVC绑定。 Read the full story here。因此,我们必须创建我们自己的自定义模型联编程序,以将字典作为控制器操作的参数。

为了解决您的要求,这里是工作的解决方案 -

首先创建下面的方式您的ViewModels。 PersonModel可以有RoleModel的列表。

public class PersonModel 
{ 
    public List<RoleModel> Roles { get; set; } 
    public string Name { get; set; } 
} 

public class RoleModel 
{ 
    public string RoleName { get; set;} 
    public string Description { get; set;} 
} 

然后让这将是服务的基本指数视图索引操作 -

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

索引视图将具有以下JQuery的AJAX POST操作 -

<script src="~/Scripts/jquery-1.10.2.min.js"></script> 
<script> 
    $(function() { 
     $('#click1').click(function (e) { 

      var jsonObject = { 
       "Name" : "Rami", 
       "Roles": [{ "RoleName": "Admin", "Description" : "Admin Role"}, { "RoleName": "User", "Description" : "User Role"}] 
      }; 

      $.ajax({ 
       url: "@Url.Action("AddUser")", 
       type: "POST", 
       data: JSON.stringify(jsonObject), 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       error: function (response) { 
        alert(response.responseText); 
      }, 
       success: function (response) { 
        alert(response); 
       } 
      }); 

     }); 
    }); 
</script> 

<input type="button" value="click1" id="click1" /> 

Index操作职位,以ADDUSER动作 -

[HttpPost] 
    public ActionResult AddUser(PersonModel model) 
    { 
     if (model != null) 
     { 
      return Json("Success"); 
     } 
     else 
     { 
      return Json("An Error Has occoured"); 
     } 

    } 

所以现在,当帖子发生时,您可以获取动作模型参数中的所有发布数据。

enter image description here

+1

嗯,所以它需要是一个POST?我有同样的问题,模型的参数是'null',但是当我将POST添加到我的ajax调用和mvc控制器时,我的模型不再为空。唯一困扰我的是,如果您将字符串赋给javascript中的某个属性,并将此对象与ajax一起传递给服务器,那么在C#中,服务器会将这些空字符串属性读作'null'。我宁愿他们在C#中也是一个空字符串。 – QuantumHive

+0

发现上述问题的解决方案:http://stackoverflow.com/questions/12734083/string-empty-converted-to-null-when-passing-json-object-to-mvc-controller – QuantumHive

+2

我复制/粘贴这和我'命中'的方法,但model.Name为null(如同角色) 我正在使用.NET核心 - 是否有一个设置,我必须改变? –

11

这里有几个问题。首先,您需要确保将您的JSON对象绑定回控制器中的模型。这是通过改变

data: JSON.stringify(usersRoles), 

data: { model: JSON.stringify(usersRoles) }, 

其次,你没有正确使用您的jQuery电话绑定类型。如果删除

contentType: "application/json; charset=utf-8", 

它将固有地绑定回字符串。

总之,使用第一的ActionResult方法及以下的jQuery AJAX调用:

jQuery.ajax({ 
     type: "POST", 
     url: "@Url.Action("AddUser")", 
     dataType: "json", 
     data: { model: JSON.stringify(usersRoles) }, 
     success: function (data) { alert(data); }, 
     failure: function (errMsg) { 
     alert(errMsg); 
     } 
    }); 
+0

这对我有用,我摆脱了stringify,因为它把引号放在我的字符串中,但是当我没有调用stringify时,它没有引号控制器。这允许我通过一个帖子将一个字符串放入我的控制器中。这让我满意。 –

4

您要发送的字符串的数组

var usersRoles = []; 
jQuery("#dualSelectRoles2 option").each(function() { 
    usersRoles.push(jQuery(this).val()); 
}); 

因此更改模型类型相应

public ActionResult AddUser(List<string> model) 
{ 
} 
+0

+1这应该做的工作 – Leo

+0

所以你说我不应该jsonify的数据? – Zapnologica

+0

@Zapnologica,'data:JSON.stringify(usersRoles)'只是正确的,你需要。你的ajax代码是完美的。但你的操作方法需要一个字典参数,但你要发送一个字符串数组:) –

1

FWIW,这并没有为我工作,直到我有这样的阿贾克斯电话:

contentType: "application/json; charset=utf-8", 

使用Asp.Net MVC 4.