Мой текущий код выглядит следующим образом. Как передать свой массив контроллеру и какие параметры должны принимать мои действия контроллера?
function getplaceholders() {
var placeholders = $('.ui-sortable');
var result = new Array();
placeholders.each(function() {
var ph = $(this).attr('id');
var sections = $(this).find('.sort');
var section;
sections.each(function(i, item) {
var sid = $(item).attr('id');
result.push({ 'SectionId': sid, 'Placeholder': ph, 'Position': i });
});
});
alert(result.toString());
$.post(
'/portal/Designer.mvc/SaveOrUpdate',
result,
function(data) {
alert(data.Result);
}, "json");
};
Мой метод действий с контроллером выглядит как
public JsonResult SaveOrUpdate(IList<PageDesignWidget> widgets)
Ответ 1
Я нашел решение. Я использую решение Steve Gentile, jQuery и ASP.NET MVC - отправка JSON в Action - Revisited.
Мой код представления ASP.NET MVC выглядит так:
function getplaceholders() {
var placeholders = $('.ui-sortable');
var results = new Array();
placeholders.each(function() {
var ph = $(this).attr('id');
var sections = $(this).find('.sort');
var section;
sections.each(function(i, item) {
var sid = $(item).attr('id');
var o = { 'SectionId': sid, 'Placeholder': ph, 'Position': i };
results.push(o);
});
});
var postData = { widgets: results };
var widgets = results;
$.ajax({
url: '/portal/Designer.mvc/SaveOrUpdate',
type: 'POST',
dataType: 'json',
data: $.toJSON(widgets),
contentType: 'application/json; charset=utf-8',
success: function(result) {
alert(result.Result);
}
});
};
и мое действие контроллера украшено настраиваемым атрибутом
[JsonFilter(Param = "widgets", JsonDataType = typeof(List<PageDesignWidget>))]
public JsonResult SaveOrUpdate(List<PageDesignWidget> widgets
Код для настраиваемого атрибута можно найти здесь (ссылка сейчас не работает).
Поскольку ссылка сломана, это код для JsonFilterAttribute
public class JsonFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent;
using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
inputContent = sr.ReadToEnd();
}
var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
JsonConvert.DeserializeObject от Json.NET
Ссылка: Сериализация и десериализация JSON с Json.NET
Ответ 2
Action Filters, jquery stringify, bleh...
Питер, эта функция является родной для MVC. Это одна из вещей, которая делает MVC таким замечательным.
$.post('SomeController/Batch', { 'ids': ['1', '2', '3']}, function (r) {
...
});
И в действии
[HttpPost]
public ActionResult Batch(string[] ids)
{
}
Работает как шарм:
![enter image description here]()
Если вы используете jQuery 1.4+, то вы хотите посмотреть в настройке традиционного режима:
jQuery.ajaxSettings.traditional = true;
Как описано здесь: http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/02/24/jquery-1-4-breaks-asp-net-mvc-actions-with-array-parameters
Это даже работает для сложных объектов. Если вам интересно, вы должны изучить документацию MVC о привязке модели: http://msdn.microsoft.com/en-us/library/dd410405.aspx
Ответ 3
В .NET4.5
, MVC 5
нет необходимости в виджетах.
JavaScript:
объект в JS:
![enter image description here]()
который делает сообщение.
$('.button-green-large').click(function() {
$.ajax({
url: 'Quote',
type: "POST",
dataType: "json",
data: JSON.stringify(document.selectedProduct),
contentType: 'application/json; charset=utf-8',
});
});
С#
Объекты:
public class WillsQuoteViewModel
{
public string Product { get; set; }
public List<ClaimedFee> ClaimedFees { get; set; }
}
public partial class ClaimedFee //Generated by EF6
{
public long Id { get; set; }
public long JourneyId { get; set; }
public string Title { get; set; }
public decimal Net { get; set; }
public decimal Vat { get; set; }
public string Type { get; set; }
public virtual Journey Journey { get; set; }
}
Контроллер:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}
Полученный объект:
![enter image description here]()
Надеюсь, это сэкономит вам некоторое время.
Ответ 4
К второй половине Создать REST API с помощью ASP.NET MVC, который говорит как JSON, так и простой XML, чтобы указать:
Теперь нам нужно принять полезную нагрузку JSON и XML, поставляемую через HTTP POST. Иногда ваш клиент может захотеть загрузить коллекцию объектов одним выстрелом для пакетной обработки. Таким образом, они могут загружать объекты с использованием формата JSON или XML. Там нет встроенной поддержки в ASP.NET MVC для автоматического анализа опубликованных JSON или XML и автоматически отображать параметры действия. Итак, я написал фильтр, который делает это. "
Затем он реализует фильтр действий, который отображает объекты JSON на С# с показанным кодом.
Ответ 5
Сначала загрузите этот код JavaScript, JSON2.js, который поможет нам сериализовать объект в строку.
В моем примере я отправляю строки jqGrid через Ajax:
var commissions = new Array();
// Do several row data and do some push. In this example is just one push.
var rowData = $(GRID_AGENTS).getRowData(ids[i]);
commissions.push(rowData);
$.ajax({
type: "POST",
traditional: true,
url: '<%= Url.Content("~/") %>' + AREA + CONTROLLER + 'SubmitCommissions',
async: true,
data: JSON.stringify(commissions),
dataType: "json",
contentType: 'application/json; charset=utf-8',
success: function (data) {
if (data.Result) {
jQuery(GRID_AGENTS).trigger('reloadGrid');
}
else {
jAlert("A problem ocurred during updating", "Commissions Report");
}
}
});
Теперь на контроллере:
[HttpPost]
[JsonFilter(Param = "commissions", JsonDataType = typeof(List<CommissionsJs>))]
public ActionResult SubmitCommissions(List<CommissionsJs> commissions)
{
var result = dosomething(commissions);
var jsonData = new
{
Result = true,
Message = "Success"
};
if (result < 1)
{
jsonData = new
{
Result = false,
Message = "Problem"
};
}
return Json(jsonData);
}
Создайте класс JsonFilter (благодаря рекомендациям АО).
public class JsonFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent;
using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
inputContent = sr.ReadToEnd();
}
var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
Создайте еще один класс, чтобы фильтр мог разобрать строку JSON на фактический манипулируемый объект. Этот класс comissionsJS - это все строки моего jqGrid.
public class CommissionsJs
{
public string Amount { get; set; }
public string CheckNumber { get; set; }
public string Contract { get; set; }
public string DatePayed { get; set; }
public string DealerName { get; set; }
public string ID { get; set; }
public string IdAgentPayment { get; set; }
public string Notes { get; set; }
public string PaymentMethodName { get; set; }
public string RowNumber { get; set; }
public string AgentId { get; set; }
}
Я надеюсь, что этот пример поможет проиллюстрировать, как отправить сложный объект.
Ответ 6
[HttpPost]
public bool parseAllDocs([FromBody] IList<docObject> data)
{
// do stuff
}