JSON을 통해 ASP.Net MVC3에 개체 배열 게시
JSON을 통해 MVC3에 개체 배열을 게시하는 솔루션을 찾고 있습니다.
작업중인 예제 코드 : http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
JS :
var data = { ItemList: [ {Str: 'hi', Enabled: true} ], X: 1, Y: 2 };
$.ajax({
url: '/list/save',
data: JSON.stringify(data),
success: success,
error: error,
type: 'POST',
contentType: 'application/json, charset=utf-8',
dataType: 'json'
});
ListViewModel.cs :
public class ListViewModel
{
public List<ItemViewModel> ItemList { get; set; }
public float X { get; set; }
public float Y { get; set; }
}
ItemViewModel.cs :
public class ItemViewModel
{
public string Str; // originally posted with: { get; set; }
public bool Enabled; // originally posted with: { get; set; }
}
ListController.cs :
public ActionResult Save(ListViewModel list)
{
// Do something
}
이 POST의 결과 :
목록이 ListViewModel로 설정됩니다
. X 및 Y 속성이 설정되었습니다
. 기본 ItemList 속성이 설정되었습니다
. ItemList에는 하나의 항목이 포함되어 있어야합니다
. 해당 ItemList의 항목이 초기화되지 않았습니다. Str은 null이고 Enabled는 false입니다.
다시 말해, 이것은 MVC3의 모델 바인딩에서 얻은 것입니다.
list.X == 1
list.Y == 2
list.ItemList != null
list.ItemList.Count == 1
list.ItemList[0] != null
list.ItemList[0].Str == null
MVC3 JsonValueProvider가 복잡한 개체에 대해 작동하지 않는 것처럼 보입니다. 이 작업을 수행하려면 어떻게해야합니까? 기존 MVC3 JsonValueProvider를 수정하고 수정해야합니까? 그렇다면 MVC3 프로젝트에서 어떻게 가져 와서 교체합니까?
내가 이미 추구했던 관련 StackOverflow 질문은 소용이 없습니다.
Asp.net Mvc Ajax Json (배열 이후) MVC2 및 이전 양식 기반 인코딩을 사용합니다. 이러한 접근 방식은 개체 배열을 포함하는 개체에서 실패합니다 (JQuery가 올바르게 인코딩하지 못함).
JSON, JQuery를 사용 하여 ASP.NET MVC 컨트롤러에 복잡한 개체 배열 게시 컨트롤러가 프레임 워크를 활용하는 대신 일반 문자열을 수신 한 다음 수동으로 역 직렬화하는 곳을 피하고 싶은 해킹을 사용합니다.
MVC3 RC2 JSON Post Binding이 제대로 작동 하지 않습니다. 콘텐츠 유형이 설정되지 않았습니다. 내 코드에 설정되어 있습니다.
JSON, jQuery를 사용하여 복잡한 개체 배열을 ASP.NET MVC 컨트롤러에 게시하는 방법은 무엇입니까? 이 가난한 사람은 배열을 구문 분석하기 위해 JsonFilter를 작성해야했습니다. 내가 피하고 싶은 또 다른 해킹.
그래서 어떻게해야할까요?
이외에 { get; set; }
다음은 JSON 바인딩 지원에 대한 몇 가지 조건입니다.
- 이것은 ASP.NET MVC 3의 새로운 기능입니다 ( " JavaScript 및 AJAX 개선 사항 "참조).
- JSON 개체의 문자열 ( 'X', 'Y', 'Str'및 'Enabled')은 ViewModel 개체의 속성과 일치해야합니다.
- ViewModel 개체의 속성에는
{ get; set; }
메서드가 있어야합니다 . - 요청에서 콘텐츠 유형을 "application / json"으로 지정해야합니다.
- 여전히 작동하지 않는 경우 JSON 문자열이 유효한지 확인하십시오.
내 게시물 에서 자세히 알아보십시오 .
도움이 되었기를 바랍니다.
문제는 목록에있는 모델의 속성이 공용 속성에 대한 가져 오기 / 설정이 없다는 것입니다. 다시 말해, MVC3의 자동 JSON 바인딩은 get 및 set가있는 개체 속성에서만 작동합니다.
이것은 바인딩되지 않습니다.
public string Str;
이것은 바인딩됩니다 :
public string Str { get; set; }
이상하다. 나는 당신의 행동을 재현 할 수 없습니다. 내 설정은 다음과 같습니다 (ASP.NET MVC 3 RTM).
모델:
public class ItemViewModel
{
public string Str { get; set; }
public bool Enabled { get; set; }
}
public class ListViewModel
{
public List<ItemViewModel> ItemList { get; set; }
public float X { get; set; }
public float Y { get; set; }
}
제어 장치:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Save(ListViewModel list)
{
return Json(list);
}
}
전망:
@{
ViewBag.Title = "Home Page";
}
<script type="text/javascript">
$(function () {
var data = { ItemList: [{ Str: 'hi', Enabled: true}], X: 1, Y: 2 };
$.ajax({
url: '@Url.Action("save", "home")',
data: JSON.stringify(data),
type: 'POST',
contentType: 'application/json',
dataType: 'json',
success: function (result) {
alert(result.ItemList[0].Str);
}
});
});
</script>
이 경고를 실행 "hi"
하고 Save
작업 내부에서 모든 것이 올바르게 초기화됩니다.
그리고 기록을 위해 작동하지 않는 것은 사전입니다. 나는 한 티켓 오픈 문제에 대한합니다.
I had a similar issue, and found that for a complex object, the numeric values were getting missed. They were coming in as zeros. i.e.
var person = {
Name: "john",
Age: 9
}
was being received by MVC controller as a Person object where the properties were being populated as Name=John
and Age=0
.
I then made the Age value in Javascript to be string... i.e.
var person = {
Name: "john",
Age: "9"
}
And this came through just fine...
Its because the MVC binders kind of suck. However, they do work pretty well if all JSON values come over as a string.
In JS if you do this
var myObject = {thisNumber:1.6};
myObject.thisNumber=myObject.thisNumber-.6;
It will evaluate to 1 not to 1.0
So when you sent it over to the server it will try to bind to a float of that name and it will not find it since it came over as 1 instead of 1.0. Its very lame and crazy that MS engineers did not come up with a default solution to this. I find if you string everything the bindings are smart enough to find things.
So before sending the data over run it though a stringifier that will also convert all values to strings.
All previous answers were great to point me to solution of the similar problem. I had to POST x-www-form-urlencoding
instead of application/json
(default option if contentType parameter is missing) to be able to pass __RequestVerificationToken
and simultaneously faced with problem when object properties being in the array do not bind their values. The way to solve the issue is to understand internal work of MVC model binder.
So, basically when you need to supply verification token you are restricted with validation attribute. And you must provide the token as the parameter not as a part of the JSON-object you are sending. If you would not use ValidateAntiForgeryToken
, you could get along with JSON.stringify. But if you would, you could not pass the token.
I sniffed traffic to backend when ContentType
was x-www-form-urlencoding
and I remarked that my array of complex objects was serialized to something like that: klo[0][Count]=233&klo[0][Blobs]=94
. This array initially was a part of root object, let's say some model. It looked like that: model.klo = [{ Count: 233, Blobs: 94}, ...]
.
At the backend side this klo
property was creating by MVC binder with the same elements count that I sent. But these elements itself did not obtain values for their properties.
SOLUTION
To deal with this I excluded klo
property from the model object at the client side. In the ajax
function I wrote this code:
data: $.param(model) + "&" + arrayOfObjectsToFormEncoding("klo", [{ Count: 233, Blobs: 94}, ...])
....
function arrayOfObjectsToFormEncoding (modelPropertyName, arrayOfObjects) {
var result = "";
if (arrayOfObjects && typeof arrayOfObjects == "object") {
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (obj) {
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
result += encodeURIComponent(modelPropertyName + "[" + i + "]." + p) + "=" + encodeURIComponent(obj[p]) + "&";
}
}
}
}
}
if (result[result.length - 1] == "&") {
result = result.substr(0, result.length - 1);
}
return result;
}
The function transforms array of complex object into form that is recognized by MVC-binder. The form is klo[0].Count=233&klo[0].Blobs=94
.
참고URL : https://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp-net-mvc3
'program tip' 카테고리의 다른 글
각 클라이언트에 단일 데이터베이스를 사용하면 어떤 이점이 있습니까? (0) | 2020.11.18 |
---|---|
부울 연산자를 전처리 기와 함께 사용할 수 있습니까? (0) | 2020.11.18 |
빌드 중 면도기 오류 확인 (0) | 2020.11.18 |
멀티 뷰 애플리케이션을위한 knockoutjs 패턴의 예 (0) | 2020.11.18 |
net / http로 쿠키 설정 (0) | 2020.11.18 |