Разбор массива строк для метода MVC - PullRequest
1 голос
/ 18 августа 2011

Я пытаюсь разобрать простой массив направляющих / строк в json, json используется в качестве параметра при последующем вызове моего контроллера.

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

Массив построен из значений флажков:

$('input:checkbox').click(function () {
        if ($(this).attr("checked") == true) {
            selected.push($(this).val());
        }
    });

и выглядит хорошо.затем я пытаюсь преобразовать его в JSON

$(document).ready(function () {
    $('#Summarize').click(function () {
        var arrayJson = {};
        for (i in selected) {
            arrayJson[i] = selected[i];
        }
        var json = {
            SelectedQuantities: arrayJson
        };

        $.ajax({
            url: "/MVC/Physical/SelectQuantities/@Model.TopID",
            type: "POST",
            data: JSON.stringify(json),
            dataType: "json",
            contentType: 'application/json',
            success: function (result) {
                debugger;
                if (result.status == 200)
                    location.replace = "/MVC/Physical/QuantitySummaryView/@Model.TopID"
                else {
                    //Handle error
                }

            }
        });
    });
});

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

public ActionResult QuantitySummaryView(Guid id, List<String> SelectedQuantities)

Но список всегда нулевой.Я подумал, что это потому, что список JSON не содержит массив GUID непосредственно под ним.

Можете ли вы помочь мне подтолкнуть его на месте?

JSON (как видно из инструментов Chromes dev) выглядит следующим образом:

{
"SelectedQuantities": {
    "0": "707c40bd-4434-41ed-80fd-4ac541a81e85",
    "1": "a8d78a4b-b107-4e1c-97b5-5d8abf530ba8",
    "2": "a19226cc-9b22-4174-97e3-bb003d4b2746"
}

}

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Вам не нужно структурировать json, а также не нужно добавлять двойное SelectedQuantities

$(document).ready(function () {
    $('#Summarize').click(function () {
        var arrayJson = {};
        for (var i in selected) {
            arrayJson[i] = selected[i];
        }

        var json = {
            SelectedQuantities: arrayJson
        };
        //json = JSON.stringify(json);
        $.post("/Home/QuantitySummaryView/@Model.TopID", json, true);
    });
});

Однако, основываясь на вашем коде, вы получите только проверенное количество элементов (всеиз них равно «on») У вас нет кода для передачи имени проверенного элемента, а также для тех, которые не были проверены.Так что вам, возможно, придется изменить свой код, чтобы обработать пары имя / значение.

1 голос
/ 18 августа 2011

Я думаю, что вы сериализуете слишком много раз, и у вас есть слишком много слоев.Попробуйте это:

Я удалил одно из SelectedQuantities и изменил вызов ajax.

$(document).ready(function () {
    $('#Summarize').click(function () {
        var arrayJson = {};
        for (i in selected) {
            arrayJson[i] = selected[i];
        }

        var json = {
            SelectedQuantities: arrayJson
        };

        $.ajax({
            url: "/MVC/Physical/QuantitySummaryView/@Model.TopID",
            type: "POST",
            data: JSON.stringify(json),
            dataType: "json",
            contentType: 'application/json'
        });
    });
});

Кроме того, попробуйте Firebug, он покажет, что вы были переданы на сервер, чтобы выубедитесь, что созданный и переданный json верен.

0 голосов
/ 18 августа 2011

Например:

Модель, которая содержит коллекцию идентификаторов GUID:

public class GuidModel
{
    public GuidModel()
    {
        Guids = new List<Guid>();

        Guids.Add(Guid.NewGuid());
        Guids.Add(Guid.NewGuid());
        Guids.Add(Guid.NewGuid());
        Guids.Add(Guid.NewGuid());
        Guids.Add(Guid.NewGuid());
    }

    public IList<Guid> Guids { get; set; }
}

Флажки отображаются представлением:

<% var index = 1; %>
    <% foreach(var guid in Model.Guids) { %>
        <input type="checkbox" value="<%= guid %>" name="guid<%= index %>" />
     <%: guid %>
     <br />
     <% index++; %>
<% } %>
<br />
<input type="button" value="Summarize" id="Summarize" />    

JavaScript / JQuery:

<script type="text/javascript">
    var selected = [];

    $('input:checkbox').click(function () {
        if ($(this).attr("checked") == true) {
            selected.push($(this).val());
        }
    });

    $('#Summarize').click(function () {
        var arrayJson = {};
        for (i in selected) {
            arrayJson[i] = selected[i];
        }

        var json = {
            SelectedQuantities: arrayJson
        };
        json = JSON.stringify(json);

        $.post("/Home/QuantitySummaryView?data=" + json);
    });
</script>

Метод действия в контроллере:

[HttpPost]
public ActionResult QuantitySummaryView(string data)
{
    // Deserialize the string containing JSON serialized data
    JavaScriptSerializer jss = new JavaScriptSerializer();    
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...