Как получить JSON в качестве параметра метода действия MVC 5
Я пытался весь день ползать по сети, пытаясь получить объект JSON в контроллере действий.
каков правильный и или более простой способ сделать это?
Я пробовал следующие: 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?
4 ответа:
к сожалению, словарь имеет проблемы с привязкой модели в MVC. читать здесь. Вместо этого создайте пользовательскую привязку модели, чтобы получить словарь в качестве параметра для действия контроллера.
чтобы решить ваши требования, вот рабочее решение -
сначала создайте свои ViewModels следующим образом. PersonModel может иметь список 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;} }
затем есть индексное действие, которое будет служить базовому индексному представлению -
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" />
индексировать сообщения действия для добавления действия пользователя -
[HttpPost] public ActionResult AddUser(PersonModel model) { if (model != null) { return Json("Success"); } else { return Json("An Error Has occoured"); } }
Итак, теперь, когда сообщение происходит, вы можете получить все опубликованные данные в параметре модели действия.
есть несколько вопросов здесь. Во-первых, вам нужно обязательно привязать свой объект JSON обратно к модели в контроллере. Это делается путем изменения
data: JSON.stringify(usersRoles),
до
data: { model: JSON.stringify(usersRoles) },
во-вторых, вы не связываете типы правильно с вашим вызовом jquery. Если вы удалите
contentType: "application/json; charset=utf-8",
он будет по своей сути привязываться к строке.
все вместе, используйте первый метод ActionResult и следующий вызов ajax jquery:
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); } });