Передача данных из JQuery в действие контроллера - PullRequest
1 голос
/ 18 марта 2009

Нужно ли делать что-то особенное с моим методом действия контроллера, чтобы принимать / связывать данные из вызова .ajax ()?

Действие контроллера -

public class TestController : Controller
{
    public JsonResult GetTestJsonData(Metadata data)
    {
        return new JsonResult { Data = data };
    }
}

JQuery Call -

<script type="text/javascript">
    $(document).ready(function() {
        $.ajax({
            type: "POST",
            url: "GetTestJsonData",
            data: "{ data: {Name:'joe'}}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                alert("Name = " + msg.Name);
            }
        });
    });
</script>

Я ожидаю, что эта страница выдаст предупреждение с именем 'joe'. Я передаю данные json от клиента в действие контроллера, и действие передает их обратно клиенту. Это просто простой пример того, что я пытаюсь сделать.

Ответы [ 5 ]

3 голосов
/ 18 марта 2009

Другие ответы требуют пользовательского связующего, но если это выходит за рамки вашего приложения, есть другой способ. Нет необходимости десериализовать POST, если ваши свойства JSON соответствуют параметрам в вашем методе ActionResult (т.е. это не сложный объект JSON).

<script type="text/javascript">
    $(document).ready(function() {
        $.ajax({
                type: "POST",
                url: "GetTestJsonData",
                data: "{ name:'joe', id:1, age:18 }",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                        alert("Name = " + msg.Name);
                }
        });
    });
</script>

Который может быть использован следующим ActionResult:

public ActionResult GetTestJsonData(string name, int id, int age)
{
  Metadata data = new Metadata(name, id, age);

  return Json(data);
}
3 голосов
/ 18 марта 2009

Ваш код, вероятно, будет работать для простого примера, поскольку вы ничего не анализируете, однако, если вы хотите преобразовать свой JSON в реальный объект в действии контроллера, вам нужно будет сообщить MVC, как это сделать.

В блоге есть сообщение о написании JsonFilterAttribute, который использует Json.NET для десериализации входящего JSON и преобразования его в объект.

http://blogger.forgottenskies.com/?p=252

0 голосов
/ 11 декабря 2010

Прошло много времени с тех пор, как вы решили эту проблему, но, надеюсь, мой ответ поможет вам в будущем с подобными процессами .

Я не могу напрямую говорить о проблемах с ответом, который вы приняли (так как все ссылки на код в связанном блоге к настоящему времени устарели), но, поскольку он использует Json.Net, я думаю, что решение использовало технику для метод string to action, а затем проанализируйте его с помощью Json.NET в самом методе действия.

Эти методы обходят великолепную возможность автоматической проверки состояния модели в Asp.net MVC 2+.

Я написал сообщение в блоге, в котором непосредственно рассматривается эта проблема и предоставляется самый простой способ заставить все работать так, как ожидалось.

Я предлагаю вам прочитать его для дальнейшего использования:
Отправка сложных объектов JSON в Asp.net MVC с использованием jQuery

0 голосов
/ 26 марта 2009

Я использовал класс JavaScriptSerializer в пространстве имен System.Web.Script.Serialization, чтобы сделать это с большим успехом, и это не может быть проще. Ключ в том, что ваш javascript-объект json, который вы передаете методу контроллера, должен иметь ту же структуру, что и объект .NET, к которому вы пытаетесь его сериализовать. Например, предположим, что это целевой объект .NET в вашем контроллере.

class TestObject {
    public string Name {get;set;}
    public int Age {get;set;}
}

Тогда ваш объект JavaScript будет выглядеть так ...

{Name: 'Lunchy', Age: 28}

Затем в вашем контроллере, который будет выглядеть примерно так (при условии, что вы преобразуете свой объект javascript перед передачей его в свой контроллер. Я использую метод JSON.stringify (jsObj)).

public JsonResult TestSerialization(string jsonString)
{
    var jss = new JavaScriptSerializer();
    TestObject to = jss.Deserialize<TestObject>(jsonString);

    return Json(TestObject);
}

Это непроверенный код, и я особенно не уверен в моем синтаксисе объекта json, но, надеюсь, вы поняли идею. Также обратите внимание, что MSDN может показать, что класс JavaScriptSerializer был помечен как устаревший, но он был отозван. На самом деле это класс, который MVC-инфраструктура использует для своей сериализации json.

0 голосов
/ 18 марта 2009

Напишите собственный ModelBinder, который понимает JSON. Вы можете использовать библиотеку JSON для десериализации этого объекта и затем вернуть его.

Тогда ваше действие становится:

public ActionResult GetTestJsonData([JsonBinder] Metadata data)
{
   return Json(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...