2013-02-13 3 views
4

ASP.NET MVC 및 jQuery를 사용하여 AJAX 호출을 통해 일부 데이터를 저장하고 있습니다. 현재 jQuery ajax() 함수를 사용하여 일부 JSON 데이터를 전달합니다.JSON 데이터를 컨트롤러 메서드에 객체 선언없이 전달

$.ajax({ 
    dataType: 'json', 
    type: 'POST', 
    url: '@Url.Action("UpdateName", "Edit")', 
    data: { 
     id: 16, 
     name: 'Johnny C. Bad' 
    } 
}); 

이 컨트롤러 메서드와 헬퍼 클래스를 사용합니다.

public void UpdateName(Poco poco) 
{ 
    var person = PersonController.GetPerson(poco.Id); 
    person.Name = poco.Name; 
    PersonController.UpdatePerson(person); 
} 

public class Poco 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

JSON 데이터를 수용하는 또 다른 방법은 단순히이

public void UpdateName(int id, string name) 
{ 
    var person = PersonController.GetPerson(id);  
    person.Name = name; 
    PersonController.UpdatePerson(person); 
} 

이러한 접근 방식은 인수의 작은 숫자에 대한 확인,하지만 내 실제 코드는 일반적으로 약 5있다 것처럼 여러 인수를 사용하는 것입니다 - 10 개의 주장. 이 모든 인수를 선언하고 사용해야하는 대신 오브젝트를 사용하면 매우 편리합니다.

나는이 방법을 사용하려는 각 컨트롤러 메소드에 대한 클래스를 선언하는 데 하나의 개체로 JSON 데이터를 받아들이고하지 않는 다른 방법이 있다면 내가 wondernig있어

예를 들어,이 같은 :.

public void UpdateName(dynamic someData) 
{ 
    var person = PersonController.GetPerson(someData.Id); 
    person.Name = someData.Name; 
    PersonController.UpdatePerson(person); 
} 
+0

당신이 할 수있는 복잡한 개체를 JSon으로 변환하는 한 확실히 게시하십시오. 복잡한 객체를 jscript 또는 Razor 변수로 빌드 하시겠습니까? –

+0

또 다른 옵션은 json 데이터를 문자열로 받아서 작업에서 비 직렬화하는 것입니다. –

+0

http://stackoverflow.com/questions/11608026/asp-net-mvc-can-json-object-be-passed-to-a-controller-with-parameter-with-dynami –

답변

1

가능한 해결 방법



    public class DynamicModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      if (controllerContext.HttpContext.Request.Form.AllKeys.Any(x => x == "dynamic")) 
      { 
       dynamic model = new ExpandoObject(); 
       IDictionary underlyingmodel = model; 

       foreach (var key in controllerContext.HttpContext.Request.Form.AllKeys) 
        underlyingmodel.Add(key, (bindingContext.ValueProvider.GetValue(key).RawValue as string[]).First()); 

       return model; 
      } 

      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 

이 바인더 이름으로 특정 입력을 확인합니다

예를 들어 특정 모델 바인더를 작성 후 동적 객체를 "동적"만들



    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(dynamic input) 
    { 
     ViewBag.Result = input.phrase; 
     return View(); 
    } 

0

엔티티간에 컨트롤러에서 공유하고자하는 공통 기능을 정확히 알고 있다고 가정합니다. 이 모든 기능을 일부 공유 속성 (위의 예제에서 어쩌면 Id 및 Name 필드) 뒤에 통합 할 수 있다면 IEntity의 인스턴스를 앞뒤로 전달하거나이 두 속성을 포함하는 기본 클래스를 전달할 수 있습니다.

3

당신은 FormCollection를 받아 들일 수 것처럼 보일 것이다 : 나는 당신이 그것을 달성하고자하는 이유를 확실히 모르겠습니다

public void UpdateName(FormCollection collection) 
{ 
    var person = PersonController.GetPerson(int.Parse(collection["id"])); 
    person.Name = collection["name"]; 
    person.Age = collection["age"]; 

    PersonController.UpdatePerson(person); 
} 
1

,하지만 당신이 동적 사용하여 달성 할 수있다 (나는이 시도하지 않았다)

public void UpdateName(string parameters) 
{ 
    var dynamicObject = Json.Decode(parameters); 
} 

Json.Decode는 System.Web.Healpers 네임 스페이스

에 그리고 다음과 같이 자바 스크립트에서 그들을 통과 할 수

var dataObject = JSON.stringify({ id: '1', name: 'John' }); 
$.ajax({ 
    dataType: 'json', 
    type: 'POST', 
    url: '@Url.Action("UpdateName", "Edit")', 
    data: dataObject 
}); 
관련 문제