JSON, jQuery를 사용하여 복잡한 개체 배열을 ASP.NET MVC 컨트롤러에 게시하는 방법은 무엇입니까?
내 현재 코드는 다음과 같습니다. 어레이를 컨트롤러에 전달하려면 어떻게해야하며 컨트롤러 작업이 허용해야하는 매개 변수의 종류는 무엇입니까?
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)
해결책을 찾았습니다. 나는 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.NET으로 JSON 직렬화 및 역 직렬화
액션 필터, jquery stringify, bleh ...
Peter,이 기능은 MVC의 기본 기능입니다. 이것이 MVC를 훌륭하게 만드는 요소 중 하나입니다.
$.post('SomeController/Batch', { 'ids': ['1', '2', '3']}, function (r) {
...
});
그리고 행동에서
[HttpPost]
public ActionResult Batch(string[] ids)
{
}
매력처럼 작동 :
jQuery 1.4 이상을 사용하는 경우 기존 모드 설정을 살펴보고 싶습니다.
jQuery.ajaxSettings.traditional = true;
이것은 복잡한 개체에도 적용됩니다. 관심이 있으시면 모델 바인딩에 대한 MVC 설명서를 참조 하십시오 . http://msdn.microsoft.com/en-us/library/dd410405.aspx
에서 .NET4.5
, MVC 5
위젯 필요가 없습니다.
자바 스크립트 :
JS의 객체 :
게시하는 메커니즘.
$('.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)
{
....
}
받은 물건 :
이것이 시간을 절약하기를 바랍니다.
Towards the second half of Create REST API using ASP.NET MVC that speaks both JSON and plain XML, to quote:
Now we need to accept JSON and XML payload, delivered via HTTP POST. Sometimes your client might want to upload a collection of objects in one shot for batch processing. So, they can upload objects using either JSON or XML format. There's no native support in ASP.NET MVC to automatically parse posted JSON or XML and automatically map to Action parameters. So, I wrote a filter that does it."
He then implements an action filter that maps the JSON to C# objects with code shown.
First download this JavaScript code, JSON2.js, that will help us serialize the object into a string.
In my example I'm posting the rows of a jqGrid via 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 클래스를 만듭니다 (JSC 참조 덕분에).
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; }
}
이 예제가 복잡한 개체를 게시하는 방법을 설명하는 데 도움이되기를 바랍니다.
세상에. 특별한 일을 할 필요가 없습니다. 게시물 섹션에서만 다음을 수행하십시오.
$.post(yourURL,{ '': results})(function(e){ ...}
서버에서 다음을 사용하십시오.
public ActionResult MethodName(List<yourViewModel> model){...}
이 링크 는 당신을 도와줍니다 ...
[HttpPost]
public bool parseAllDocs([FromBody] IList<docObject> data)
{
// do stuff
}
'Programing' 카테고리의 다른 글
터미널 애플리케이션을위한 좋은 Java, curses와 유사한 라이브러리는 무엇입니까? (0) | 2020.09.01 |
---|---|
CSS 테이블 레이아웃 : 테이블 행이 여백을 허용하지 않는 이유는 무엇입니까? (0) | 2020.09.01 |
요인 수준과 요인 레이블 간의 혼동 (0) | 2020.09.01 |
Git rebase-모든 병합 충돌이 해결 된 경우에도 계속 불평 (0) | 2020.09.01 |
DataContractSerializer가 내 생성자를 호출하지 않습니까? (0) | 2020.09.01 |