programing

ASP.NET MVC 파라미터로서 JSON 객체를 View에서 컨트롤러로 전달하는 방법

fastcode 2023. 3. 16. 21:55
반응형

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'가 된다.

그 때문에,

  1. 서버에 JSON을 전달하지 않습니다.JSON을 jQuery에게 넘기고 있습니다.
  2. 모델 바인딩은 다른 경우와 동일한 방식으로 수행됩니다.

단순한 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으로 '고정'합니다.

http://nali.org/asp-net-mvc-expecting-element-root-from-namespace-encountered-none-with-name-namespace/

언급URL : https://stackoverflow.com/questions/560575/asp-net-mvc-how-to-pass-json-object-from-view-to-controller-as-parameter

반응형