Передача данных Json в контроллер MVC — параметр JObject метода действия

Извините за неправильное форматирование или написание. Поскольку я пишу этот пост в спешке. :)

Я передаю данные json методу действия простого контроллера (контроллера MVC). Ниже приведен пример кода для справки.

JS-КОД:

var json = {IsInit: true, SearchParam: { Тип: "xx", Имя: "xx", сортировка: ""} };

    Nx$(document).ready(function () {

        Nx$.ajax({
            async: true,
            contentType: "application/json; charset=utf-8",
            type: "POST",
            url: "Home/Data",
            dataType: "json",
            data: JSON.stringify(json),
            success: function (msg) {
                alert('success');
            },
            error: function (jqxhr, textStatus, error) {
                alert('fail');
            }
        });

Метод действия:

<HttpPost>
        <Route("Data")>
        Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Newtonsoft.Json.Linq.JObject) As ActionResult
            Return Nothing
        End Function

Теперь вышеуказанное действие вообще не вызывается. но если вы используете приведенный ниже код, он выполняет вызов, но SearchParam имеет только тип [объект], и вы не можете использовать какое-либо значение объекта searchParam.

<HttpPost>
    <Route("Data")>
    Public Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Object) As Object
        Return Nothing
    End Function

Я думаю, что он не может передать несколько параметров в запросе POST со сложным объектом json.

Как я могу получить данные JSON, переданные в метод действия контроллера MVC, чтобы данные SearchParam Json были преобразованы в JObject самостоятельно. т. е. первоначальная сигнатура первого метода действия должна использоваться без каких-либо серьезных изменений сигнатуры метода.

Немного наблюдений:

  1. если бы я включил вышеуказанный метод действия как API в контроллере API; он начинает работать, но сказав, что вам нужно следовать приведенной ниже сигнатуре метода. нижеприведенный подход не работает для контроллера MVC. Не знаю почему?? Однако по какой-то причине; я не могу пойти с контроллером API.

        <HttpPost>
        <Route("Data")>
        Function GetData(ByVal req As Newtonsoft.Json.Linq.JObject) As ActionResult
            Return Nothing
        End Function
    

Спасибо !!


person Dinesh Prajapati    schedule 12.10.2017    source источник
comment
данные: JSON.stringify(json) преобразует данные в строку. Я бы посоветовал вам удалить dataType: json в параметрах ajax.   -  person Rohit Kumar    schedule 12.10.2017


Ответы (2)


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

Пример:

Public Class MyData
    Public Property IsInit As Boolean
    Public Property Type As String
    Public Property Name As String
    Public Property Sort As String
End Class

Обратите внимание, что здесь я собрал все в один класс. Если вы хотите сохранить IsInit отдельно от остальных, вы можете разделить его следующим образом:

Public Class Param
    Public Property Type As String
    Public Property Name As String
    Public Property Sort As String
End Class

Public Class MyData
    Public Property IsInit As Boolean
    Public Property SearchParam as Param
End Class

Затем измените метод действия следующим образом:

Function GetData(<FromBody()> ByVal data As MyData) As ActionResult
    ...
End Function

Наконец, вам, вероятно, нужно использовать data: json в своем вызове, поэтому без вызова JSON.stringify().

person Peter B    schedule 12.10.2017
comment
Спасибо, Питер. Это было близко к тому, что я искал. - person Dinesh Prajapati; 13.10.2017

Спасибо Питер!! Ваш комментарий дал мне направление. Ниже приведен фрагмент кода, используемый для переноса данных JSON в объект словаря. Здесь я понимаю вашу точку зрения на то, что вы не используете JObject и вместо этого полагаетесь на объект модели. Но почему-то; я должен использовать объект словаря, чтобы получить JSON из-за динамической природы JSON из другой конечной точки.

Public Class MyData
            Public Property IsInit As Boolean
            Public Property SearchParam As Dictionary(Of Object, Object)
        End Class

Большое спасибо !!

person Dinesh Prajapati    schedule 13.10.2017