ASP.NET MVC 파라미터로서 JSON 객체를 View에서 컨트롤러로 전달하는 방법
복잡한 JSON 오브젝트가 있는데 문제없이 View로 전송됩니다(아래 그림 참조).이 데이터를 에 시리얼화하는 방법을 알 수 없습니다.AJAX 콜을 통해 컨트롤러에 반환되는 NET 객체.각 부품에 대한 자세한 내용은 다음과 같습니다.
var ObjectA = {
"Name": 1,
"Starting": new Date(1221644506800),
"Timeline": [
{
"StartTime": new Date(1221644506800),
"GoesFor": 200
}
,
{
"StartTime": new Date(1221644506800),
"GoesFor": 100
}
]
};
이 오브젝트가 컨트롤러 메서드에 어떻게 전달될 수 있는지 확실하지 않습니다.다음에는 Timelines 오브젝트가 Properties를 사용하여 위의 JS 오브젝트를 미러링하는 메서드가 있습니다.
public JsonResult Save(Timelines person)
사용하고 있는 jQuery는 다음과 같습니다.
var encoded = $.toJSON(SessionSchedule);
$.ajax({
url: "/Timeline/Save",
type: "POST",
dataType: 'json',
data: encoded,
contentType: "application/json; charset=utf-8",
beforeSend: function() { $("#saveStatus").html("Saving").show(); },
success: function(result) {
alert(result.Result);
$("#saveStatus").html(result.Result).show();
}
});
이 질문은 비슷하지만 데이터를 조작하기 위해 폼을 사용하지 않는 것과 같지는 않습니다.json을 사용하여 복잡한 유형을 ASP에 전달하는 방법.NET MVC 컨트롤러
JSON을 수동으로 역직렬화하는 'Json Filter'에 대한 참조도 있었지만 ASP를 통해 자연스럽게 할 수 있는 방법이 있는지 궁금합니다.NET MVC? 또는 이러한 방법으로 데이터를 전달하기 위한 베스트 프랙티스는 무엇입니까?
편집:
이 방법은 MVC 3이 출시되면 자동으로 처리되므로 더 이상 필요하지 않습니다. http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
다음 ObjectFilter를 사용할 수 있습니다.
public class ObjectFilter : ActionFilterAttribute {
public string Param { get; set; }
public Type RootType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) {
object o =
new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
}
}
}
그런 다음 다음과 같이 컨트롤러 방식에 적용할 수 있습니다.
[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }
따라서 기본적으로 게시물의 콘텐츠 유형이 "application/json"인 경우 즉시 실행되어 지정한 유형의 개체에 값을 매핑합니다.
"데이터를 조작하기 위해 양식을 사용하지 않습니다."라고 말합니다.하지만 당신은 POST를 하고 있다.즉, 빈 폼이라도 실제로는 폼을 사용하고 있는 것입니다.
$.ajax의 dataType은 jQuery에게 전달되는 유형이 아니라 서버가 반환되는 유형을 알려줍니다.POST는 폼만 전달할 수 있습니다.jQuery는 데이터를 키/값 쌍으로 변환하여 쿼리 문자열로 전달합니다.문서에서:
서버로 송신되는 데이터.아직 문자열이 아닌 경우 쿼리 문자열로 변환됩니다.GET 요청 URL에 추가됩니다.이 자동 처리를 방지하려면 processData 옵션을 참조하십시오.개체는 키/값 쌍이어야 합니다.값이 어레이인 경우 jQuery는 동일한 키를 사용하여 여러 값을 직렬화합니다(예: {foo:['bar1', 'bar2']}는 '&foo=bar1&foo=bar2'가 된다.
그 때문에,
- 서버에 JSON을 전달하지 않습니다.JSON을 jQuery에게 넘기고 있습니다.
- 모델 바인딩은 다른 경우와 동일한 방식으로 수행됩니다.
단순한 jQuery 플러그인의 다른 관점
이 질문에 대한 답변이 늦었지만, 저는 얼마 전에 제공했던 훌륭한 솔루션을 게시하고 있습니다.또한 복잡한 JSON을 Asp.net MVC 컨트롤러에 쉽게 전송하여 강력한 유형의 파라미터에 모델을 구속할 수 있습니다.
이 플러그인은 날짜도 지원하므로 날짜로 변환됩니다.DateTime문제없이 대응합니다.
자세한 내용은 블로그 투고에서 확인하실 수 있으며, 이 문제를 해결하기 위해 필요한 코드를 제공해 드립니다.
클라이언트 측에서 이 플러그인을 사용하면 됩니다.Ajax 요청은 다음과 같습니다.
$.ajax({
type: "POST",
url: "SomeURL",
data: $.toDictionary(yourComplexJSONobject),
success: function() { ... },
error: function() { ... }
});
하지만 이것은 단지 문제의 일부일 뿐이다.이제 복잡한 JSON을 서버에 다시 게시할 수 있지만, 이 JSON은 속성 검증 속성을 가진 복잡한 유형에 바인딩되기 때문에 이 시점에서는 실패할 수 있습니다.저도 해결책이 있어요.제 솔루션은 jQuery Ajax 기능을 이용하여 결과가 성공하거나 실패할 수 있습니다(위 코드 참조).검증에 실패하면error함수는 원래대로 호출됩니다.
사용할 수 있는 JavaScriptSerializer 클래스도 있습니다.이를 통해 json을 에 역직렬화할 수 있습니다.NET 오브젝트일반적인 것이 있습니다.Deserialize<T>단, 이 필요합니다.Javascript와 유사한 시그니처를 가지는 NET 오브젝트.또,DeserializeObject명료하게 하는 방법object그런 다음 반사 기능을 사용하여 필요한 속성을 얻을 수 있습니다.
컨트롤러가 다음 명령어를 사용하는 경우FormCollection에 아무것도 추가하지 않았습니다.datajson은 안에 있어야 한다.form[0]:
public ActionResult Save(FormCollection forms) {
string json = forms[0];
// do your thing here.
}
다음 답변은 객체 필터를 사용한 DaRKoN_의 답변에 대한 후속 답변입니다.
[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }
액션 메서드에 여러 파라미터를 전송하여 한쪽을 json 오브젝트로 하고 다른 한쪽을 플레인 스트링으로 하는 방법에 대해 고민하고 있었습니다.MVC는 처음이라 이미 Ajax 없이 문제를 해결했다는 것을 잊고 있었습니다.
예를 들어 뷰에 두 개의 다른 오브젝트가 필요하다면 어떻게 해야 할까요?View Model 클래스를 만듭니다.person 객체와 address 객체가 필요한 경우 다음을 수행합니다.
public class SomeViewModel()
{
public Person Person { get; set; }
public Address Address { get; set; }
}
그런 다음 뷰를 SomeViewModel로 바인드합니다.JSON에서도 같은 작업을 할 수 있습니다.
[ObjectFilter(Param = "jsonViewModel", RootType = typeof(JsonViewModel))] // Don't forget to add the object filter class in DaRKoN_'s answer.
public JsonResult doJsonStuff(JsonViewModel jsonViewModel)
{
Person p = jsonViewModel.Person;
Address a = jsonViewModel.Address;
// Do stuff
jsonViewModel.Person = p;
jsonViewModel.Address = a;
return Json(jsonViewModel);
}
그런 다음 뷰에서 다음과 같이 JQuery를 사용한 단순한 콜을 사용할 수 있습니다.
var json = {
Person: { Name: "John Doe", Sex: "Male", Age: 23 },
Address: { Street: "123 fk st.", City: "Redmond", State: "Washington" }
};
$.ajax({
url: 'home/doJsonStuff',
type: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(json), //You'll need to reference json2.js
success: function (response)
{
var person = response.Person;
var address = response.Address;
}
});
위의 Dan의 코멘트에 대한 답변:
같은 것을 구현하기 위해 이 메서드를 사용하고 있습니다만, 어떤 이유로 인해 ReadObject 메서드에서 예외가 발생하고 있습니다. "Expecting element 'root from namespace "..이름이 ' , 네임스페이스 '인 '없음'이 발견되었습니다.왜 그런지 아십니까?– Dan Applyard 2010년 4월 6일 17:57
저도 같은 문제(MVC 3 build 3.0.11209.0)가 있었는데, 아래의 투고로 해결되었습니다.기본적으로 json serializer는 처음에 없는 스트림을 읽으려고 하므로 스트림을 0으로 '고정'합니다.
언급URL : https://stackoverflow.com/questions/560575/asp-net-mvc-how-to-pass-json-object-from-view-to-controller-as-parameter
'programing' 카테고리의 다른 글
| AngularJs ng트리거 onblur 변경 (0) | 2023.03.16 |
|---|---|
| MongoDB에 있는 모든 문서의 필드 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
| Angular에서의 spec.js 파일 사용JS (0) | 2023.03.16 |
| 오류: 업데이트 실행 시 업데이트 작업 문서에 원자 연산자가 포함되어야 합니다.하나. (0) | 2023.03.16 |
| 'Ajax'가 네임스페이스 'System'에 없습니다.Web.MVC' (0) | 2023.03.16 |