asp.net - receive - send json to controller mvc 4
Cómo recibir JSON como un parámetro de método de acción MVC 5 (4)
Desafortunadamente, Dictionary tiene problemas con la vinculación de modelos en MVC. Lea la historia completa aquí . En su lugar, cree un archivador de modelo personalizado para obtener el diccionario como un parámetro para la acción del controlador.
Para resolver sus necesidades, aquí está la solución de trabajo:
Primero crea tus ViewModels de la siguiente manera. PersonModel puede tener una lista de RoleModels.
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;}
}
Luego, tiene una acción de índice que servirá para la vista de índice básica.
public ActionResult Index()
{
return View();
}
La vista de índice tendrá la siguiente operación 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" />
Publicaciones de acción de índice en la acción AddUser -
[HttpPost]
public ActionResult AddUser(PersonModel model)
{
if (model != null)
{
return Json("Success");
}
else
{
return Json("An Error Has occoured");
}
}
Entonces, cuando la publicación suceda, puede obtener todos los datos publicados en el parámetro de acción modelo.
He estado intentando toda la tarde arrastrándome por la web tratando de recibir un objeto JSON en el controlador de acción.
¿Cuál es la forma correcta y más fácil de hacerlo?
He intentado lo siguiente: 1:
//Post/ Roles/AddUser
[HttpPost]
public ActionResult AddUser(String model)
{
if(model != null)
{
return Json("Success");
}else
{
return Json("An Error Has occoured");
}
}
Lo que me dio un valor nulo en mi entrada.
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");
}
}
que me da un error de 500 en el lado jquery que está tratando de publicar en él? (lo que significa que no se unió correctamente).
aquí está mi código 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);
}
});
}
Todo lo que quiero hacer es recibir mi objeto JSON en mi acción mvc?
Hay un par de problemas aquí. En primer lugar, debe asegurarse de vincular su objeto JSON al modelo en el controlador. Esto se hace cambiando
data: JSON.stringify(usersRoles),
a
data: { model: JSON.stringify(usersRoles) },
En segundo lugar, no está vinculando tipos correctamente con su llamada jquery. Si eliminas
contentType: "application/json; charset=utf-8",
se vinculará inherentemente a una cadena.
Todos juntos, use el primer método ActionResult y la siguiente llamada 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);
}
});
Usted está enviando una serie de cadenas
var usersRoles = [];
jQuery("#dualSelectRoles2 option").each(function () {
usersRoles.push(jQuery(this).val());
});
Así que cambie el tipo de modelo en consecuencia
public ActionResult AddUser(List<string> model)
{
}
fwiw, esto no funcionó para mí hasta que tuve esto en la llamada ajax:
contentType: "application/json; charset=utf-8",
usando Asp.Net MVC 4.