2016-03-03 3 views
0

У меня есть ajax вызова контроллера на качестве ASP.NETMVC решения, которое выглядит следующим образом:Ajax вызов контроллер действия с объектом в качестве параметра

$.ajax({ 
     url: "ControllerClass/ControllerMethod?date=" + date, 
     type: "POST", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     success: function (result) { 
      globalVariable = result; // This is for later... 
      DoSomething(result); 
     }, 
     async: true, 
     processData: false 
    }) 

Контроллер, как только он сделал всю работу на сервере сторона, она возвращает объект, который содержит различные типы свойства (Int, массив Int и список объектов)

то, как я вернуть эти данные из контроллера обратно в файл JS является ...

return Json(new 
{ 
    summary = objectResult 
}); 

Дело в том, что с JavaScript, теперь я хотел бы назвать другой контроллер с информацией, что я хранится на моем GlobalVariable, который определен в моей JavaScript, как это:

var globalVariable 

Этот вар расположенный в верхней части моего файла JS ...

Ну, как я пытаюсь перезвонить мой контроллер с этой переменной выглядит следующим образом:

$.ajax({ 
       url: "ControllerClass/ControllerMethod?result=" + globalVariable, 
       type: "POST", 
       dataType: 'json', 
       contentType: 'application/json; charset=utf-8', 
       success: function (result) { 
        DoSomethingNewWithThisresult(result) 
       }, 
       async: true, 
       processData: false 
      }) 

И это мой контроллер в C#.

public IActionResult ControllerMethod(JsonResult result) 
{ 
    DoSomethingHereWithTheResult(result);  
} 

Почему, если я ставлю перебор на моем последнем контроллере, переменная результата пуста? Я проверил Chrome, что переменная содержит все данные, которые я ищу. На самом деле, если я просто передаю одно из свойств объекта, он просто подходит к контроллеру, но я не могу передать весь объект ...

ответ

1

Попробуйте создать O шп пользовательские модели вместо того, чтобы использовать JsonResult в качестве параметра в действии и использовать его в Ajax вызова следующим образом:

$.ajax({ 
      url: "ControllerClass/ControllerMethod", 
      type: "POST", 
      dataType: 'json', 
      data: { Summary: globalVariable.summary}, 
      contentType: 'application/json; charset=utf-8', 
      success: function (result) { 
       DoSomethingNewWithThisresult(result) 
      } 
     }) 


public class YourClass 
{ 
    public string Summary { get; set;}//// string type or whatever it is 
} 

public IActionResult ControllerMethod(YourClass result) 
{ 
    DoSomethingHereWithTheResult(result);  
} 

в качестве альтернативы вы можете также использовать JSON.чтобы упорядочить объект таким образом:

var customObject={ 
"Summary" : globalVariable.summary 
}; 

    $.ajax({ 
      url: "ControllerClass/ControllerMethod", 
      type: "POST", 
      dataType: 'json', 
      data: JSON.stringify(customObject), 
      contentType: 'application/json; charset=utf-8', 
      success: function (result) { 
       DoSomethingNewWithThisresult(result) 
      } 
     }) 
+0

, который был точно что мне нужно! Я не знал о свойствах данных на ajax :) Спасибо! – user3587624

0

Предполагая, что это контроллер веб-API, существует несколько способов прочитайте сложный тип из URL-адреса ((есть также аналогичные опции для контроллеров MVC)

Если параметры переданы в UrL и предполагается, что они сопоставляют 1: 1 с вашим объектом, вы можете украсить ваш объект с помощью [ FromUri] атрибут, например:

public class GeoPoint 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
} 

public ValuesController : ApiController 
{ 
    public HttpResponseMessage Get([FromUri] GeoPoint location) { ... } 
} 

Другой вариант, который дает большую гибкость, контролирующий создание вашего объекта и заполнение годовых с помощью интерфейса IModelBinder и атрибута [ModelBinder].

Вы можете реализовать интерфейс IModelBinder с помощью единственного метода «BindModel» для доступа к HTTP-запросу непосредственно перед вызовом вашего метода контроллера, создания вашего объекта, просмотра параметров запроса URL-адреса, установки значений в вашем объекте и последующего назначения это Типовым свойство BindingContext:

простой пример был бы так:

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
{ 
    if (bindingContext.ModelType == typeof(MyComplexType)) 
    { 
     MyComplexType model ; 

     //You can use the value provider or get it from the HttpRequest 
     //var theValue = bindingContext.ValueProvider.GetValue (bindingContext.ModelName); 
     //var theValue = request.RequestUri.ParseQueryString () ; 
     if (new MyComplexTypeConverter().TryParse (actionContext.Request, out model)) 
     { 
     bindingContext.Model = model; 

     return true; 
     } 
     else 
     { 
     bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Cannot convert request to MyComplexType"); 

     return false; 
     } 
    } 

    return false ; 
} 

Вот справочная документация: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

+0

Возможно, я неправильно понял эту информацию, но я думаю, что это не то, что мне действительно нужно. Мне не нужно собирать параметры из URL-адреса, а из данных JSON, которые я создал после выполнения первого вызова моего контроллера через первый вызов ajax. Мой URL-адрес не содержит никаких параметров в любое время, кстати. Благодаря! – user3587624

+0

В вашем вопросе вы добавляете globalVariable к URL-адресу вызова Ajax, например: url: «ControllerClass/ControllerMethod? Result =» + globalVariable, значение параметра результата - это то, что нужно сопоставить с параметром контроллера –